2017-02-16 68 views
0

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

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

编辑:我原来的代码中包含一些在评论中指出的错误,但我想明确我的意图,以免它会影响到访问此问题的未来访问者。

我基本上试图移位和OR或返回到一个单一的浮动,但我忘记了转移部分。另外,我现在不认为你可以在浮动上进行按位操作。无论如何,这都是一种黑客。我也认为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 
+0

如果您想要取回原始值,您(实质上)需要将您的'unsigned char *'转换为'float *'并将其解引用。 – Kevin

+0

从浮点到文本表示再返回到浮点时,您将失去精度。最佳做法是将所有内容保存在浮点中,并在输出给用户时将其转换为文本格式。 –

+1

我想你误解了所有的:bitset构造函数,'|'运算符和'static_cast '。检查文档或单独测试这些操作(使用输出语句)以将您的期望与结果进行比较 –

回答

0

前面的回答和评论已被删除(不知道为什么)导致我使用的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)); 
相关问题