C/C++ - 将24位有符号整数转换为float

Eti*_*mps 6 c c++ floating-point integer 24-bit

我正在用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;
}
Run Code Online (Sandbox Code Playgroud)

我不完全确定,但似乎我从这段代码得到的结果是不正确的.那么,我的代码是错的,如果是的话,为什么呢?

Mar*_*som 11

你没有签署将24位扩展为整数; 高位始终为零.无论您的int尺寸如何,此代码都可以使用:

if (i & 0x800000)
    i |= ~0xffffff;
Run Code Online (Sandbox Code Playgroud)

编辑:问题2是你的缩放常数.简单来说,假设转换后0保持为0.0,您希望乘以新的最大值并除以旧的最大值.

const float Q = 1.0 / 0x7fffff;
Run Code Online (Sandbox Code Playgroud)

最后,为什么在最终转换中添加0.5?我能理解你是否想要舍入到一个整数值,但是你正朝着另一个方向前进.

编辑2:您指向的来源有一个非常详细的选择理由.不是我选择的方式,但是完全可以防御.我对乘数的建议仍然存在,但最大值因0.5增加因素而有所不同:

const float Q = 1.0 / (0x7fffff + 0.5);
Run Code Online (Sandbox Code Playgroud)

因为添加后正负幅度相同,所以应该正确地缩放两个方向.

  • 24 个整数的范围不是围绕 0 对称的。负整数比正整数多(多 1)。OP想要映射到闭区间[-1.0, 1.0],我猜这就是添加的0.5的用途。 (3认同)