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
如果您想要取回原始值,您(實質上)需要將您的'unsigned char *'轉換爲'float *'並將其解引用。 – Kevin
從浮點到文本表示再返回到浮點時,您將失去精度。最佳做法是將所有內容保存在浮點中,並在輸出給用戶時將其轉換爲文本格式。 –
我想你誤解了所有的:bitset構造函數,'|'運算符和'static_cast'。檢查文檔或單獨測試這些操作(使用輸出語句)以將您的期望與結果進行比較 –