int16_t浮动转换怪异

时间:2014-07-31 17:08:37

标签: c++ c

我对这里发生的事情感到茫然。我需要将float转换为int16_t并返回。这是语法:

int16_t val = (int16_t)round((float)0xFFFE/100 * angle);
//and back
float angle = ((float)100/0xFFFE * val;

当我使用初始角度值-0.093081时,它会转换回来。但是当我使用182.241211时,它会转换回-17.764824?

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:11)

0xFFFE 几乎最大16位数;并且仅适用于无符号 16位数字。如果将它除以100然后乘以182,它肯定会溢出。

为清晰起见,让我们在基数10完全做(0xFFFE是65534):

65534 / 100 *  -0.093081 =    -60.99970254
65534 / 100 * 182.241211 = 119429.95521674

您签名的16位整数的全部范围几乎肯定是[-32768,32767]。最后的结果不合适。