我对这里发生的事情感到茫然。我需要将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?
知道发生了什么事吗?
答案 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]。最后的结果不合适。