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

前端之家收集整理的这篇文章主要介绍了C/C++ – 将24位有符号整数转换为float前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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);

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

原文链接:https://www.f2er.com/c/116765.html

猜你在找的C&C++相关文章