int16_t浮动转换怪异

Jon*_*lus 2 c c++

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

int16_t val = (int16_t)round((float)0xFFFE/100 * angle);
//and back
float angle = ((float)100/0xFFFE * val;
Run Code Online (Sandbox Code Playgroud)

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

知道发生了什么事吗?

Car*_*rum 11

0xFFFE几乎最大的16比特数; 并且只针对无符号的 16位数字.如果将它除以100然后乘以182,它肯定会溢出.

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

65534 / 100 *  -0.093081 =    -60.99970254
65534 / 100 * 182.241211 = 119429.95521674
Run Code Online (Sandbox Code Playgroud)

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