C ++ - 将float转换为unsigned char数组,然后返回float

时间:2017-02-16 20:56:39

标签: c++ floating-point memcpy unsigned-char

当我尝试将float转换为unsigned char数组然后返回float时,我没有得到原始的float值。即使我查看浮点数组的位,我也看到了一堆不同的位设置而不是最初设置的位。

以下是我在Qt控制台应用程序项目中创建的示例。

编辑:我的原始代码包含了评论中指出的一些错误,但我希望明确表达我的意图,以免混淆访问此问题的未来访问者。

我基本上试图将这些位移动并将它们移回一个浮点数,但我忘记了移位部分。另外,我现在不认为你可以对浮动进行按位操作。无论如何,这有点像hacky。我还认为std :: bitset构造函数在C ++ 11中使用了更多类型,但我不认为这是真的,所以它是隐含的。最后,我应该在尝试投射到我的新浮动时使用reinterpret_cast。

#include <QCoreApplication>
#include <iostream>
#include <bitset>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const float f = 3.2;
    unsigned char b[sizeof(float)];
    memcpy(b, &f, sizeof(f));
    const float newF = static_cast<float>(b[0] | b[1] | b[2] | b[3]);

    std::cout << "Original float: " << f << std::endl;
    // I expect "newF" to have the same value as "f"
    std::cout << "New float: " << newF << std::endl;
    std::cout << "bitset of original float:     " << std::bitset<32>(f) << std::endl;
    std::cout << "bitset of combined new float: " << std::bitset<32>(newF) << std::endl;
    std::cout << "bitset of each float bit:     " << std::endl;
    std::cout << "                       b[0]:  " << std::bitset<8>(b[0]) << std::endl;
    std::cout << "                       b[1]:  " << std::bitset<8>(b[1]) << std::endl;
    std::cout << "                       b[2]:  " << std::bitset<8>(b[2]) << std::endl;
    std::cout << "                       b[3]:  " << std::bitset<8>(b[3]) << std::endl;

    return a.exec();
}

以上代码中的输出

Original float: 3.2
New float: 205
bitset of original float:     00000000000000000000000000000011
bitset of combined new float: 00000000000000000000000011001101
bitset of each float bit:
                       b[0]:  11001101
                       b[1]:  11001100
                       b[2]:  01001100
                       b[3]:  01000000

1 个答案:

答案 0 :(得分:1)

之前已删除的答案和评论(不确定原因)导致我使用 memcpy

const float f = 3.2;
unsigned char b[sizeof(float)];
memcpy(b, &f, sizeof(f));
float newF = 0.0;
memcpy(&newF, b, sizeof(float));