2017-02-16 69 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)); 
相關問題