Если вы хотите отобразить [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
по определению, поэтому нет проблем.