C/C - 将 24 位有符号整数转换为浮点数

新手上路,请多包涵

我正在用 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 许可协议

阅读 668
1 个回答

您没有将 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);

因为加法后正负幅度相同,所以这应该正确缩放两个方向。

原文由 Mark Ransom 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题