我在C编程.我需要将24位有符号整数(存储在3字节数组中)转换为float(规范化为[-1.0,1.0]).
该平台是x86上的MSVC(这意味着输入是little-endian).
我试过这个:
float convert(const unsigned char* src) { int i = src[2]; i = (i << 8) | src[1]; i = (i << 8) | src[0]; const float Q = 2.0 / ((1 << 24) - 1.0); return (i + 0.5) * Q; }
解决方法
你没有签署将24位扩展为整数;高位始终为零.无论你的int大小是什么,这段代码都可以工作:
if (i & 0x800000) i |= ~0xffffff;
编辑:问题2是你的缩放常数.简单来说,假设转换后0保持为0.0,您希望乘以新的最大值并除以旧的最大值.
const float Q = 1.0 / 0x7fffff;
最后,为什么在最终转换中添加0.5?我能理解你是否想要舍入到一个整数值,但是你正朝着另一个方向前进.
编辑2:您指向的来源有一个非常详细的选择理由.不是我选择的方式,但是完全可以防御.我对乘数的建议仍然存在,但最大值因0.5增加因素而有所不同:
const float Q = 1.0 / (0x7fffff + 0.5);
因为添加后正负幅度相同,所以应该正确地缩放两个方向.