Лучший способ приведения от неподписанного к подписанному при отображении минимального и максимального? - PullRequest
0 голосов
/ 10 марта 2019

Кто-нибудь знает умный трюк C ++ или C для приведения uint16_t к int16_t при сопоставлении с [0; 65535] на [−32768; 32767]?

Я пытался static_cast<std::int16_t>(value - std::numeric_limits<std::int16_t>::lowest()), но я не уверен, что это оптимальное решение.Так какой же самый лучший способ?

Хотя этот вопрос в основном посвящен C ++ 11, ответы на C тоже приветствуются.

1 Ответ

3 голосов
/ 10 марта 2019

Если вы хотите отобразить [0 .. 65535] на [-32768 .. 32767], не нужно магическое заклинание c ++: просто вычтите 32768. Если ваша платформа имеет 32-битные целые числа, целочисленные продвижения сделают выражение ниже полностью определенным:

uint16_t uv = <some value>;
int16_t sv = uv - 32768;

Если доступен тип int32_t, вы можете написать:

uint16_t uv = <some value>;
int16_t sv = (int32_t)uv - 32768;

, но первая версия полностью определена также на платформах с 16-битными значениями, потому что 32768 будет иметь тип long, а uv будет преобразован в тип long, сохраняя его значение. Результат находится в диапазоне для типа int16_t по определению, поэтому нет проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...