我对这里发生的事情感到茫然.我需要将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].最后的结果不合适.