我正在用 C++ 编程。我需要将 24 位有符号整数(存储在 3 字节数组中)转换为浮点数(归一化为 [-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;
}
我不完全确定,但我从这段代码中得到的结果似乎是不正确的。那么,我的代码错了吗?如果是,为什么?
原文由 Etienne Dechamps 发布,翻译遵循 CC BY-SA 4.0 许可协议
您没有将 24 位符号扩展为整数;高位将始终为零。无论您的
int
大小如何,此代码都将起作用:编辑: 问题 2 是您的缩放常数。简单来说,您想乘以新的最大值并除以旧的最大值,假设转换后 0 保持为 0.0。
最后,为什么在最终转换中添加 0.5?如果您尝试四舍五入到整数值,我可以理解,但您正在走向另一个方向。
编辑2: 您指向的来源对您的选择有非常详细的理由。不是我会选择的方式,但仍然完全可以防御。我对乘数的建议仍然成立,但由于增加了 0.5 个因素,最大值有所不同:
因为加法后正负幅度相同,所以这应该正确缩放两个方向。