[英]Float to 4 uint8_t and display
我從Wikipedia的 float中閱讀,並嘗試打印他的位。 我使用了std :: bitset,這返回了與我期望的不同的其他位(我知道,因為我在鏈接中使用了相同數量的示例),然后我使用了memcpy()並將float的內存復制到1的4部分中每個字節並打印,此方法有效,但我有4個問題。
1)為什么在浮點數中使用位集,只打印整數部分?
2)為什么位集只能與數組一起使用而不能與浮點數一起使用?
3)memcpy()的工作順序正確嗎?
最后一個問題是因為0.15625f == 0b00111110001000000000000000000000
。
然后我認為正確的順序是:
bb[0] == 0b00111110;
bb[1] == 0b00100000;
bb[2] == 0b00000000;
bb[3] == 0b00000000;
但是返回的順序是相反的。
4)為什么會這樣?
我的代碼:
#include <cstring>
#include <iostream>
#include <bitset>
int main(int argc,char** argv){
float f = 0.15625f;
std::cout << std::bitset<32>(f) << std::endl;
//print: 00000000000000000000000000000000
//This print only integer part of the float. I tried with 5.2341 and others
uint8_t bb[4];
memcpy(bb, &f, 4);
std::cout << std::bitset<8>(bb[0]) << std::endl;
//print: 00000000
std::cout << std::bitset<8>(bb[1]) << std::endl;
//print: 00000000
std::cout << std::bitset<8>(bb[2]) << std::endl;
//print: 00100000
std::cout << std::bitset<8>(bb[3]) << std::endl;
//print: 00111110
return 0;
}
為了構建std::bitset
從float
的一個std::bitset
construtors被使用。 這里相關的是
constexpr bitset(unsigned long long val) noexcept;
在調用此構造函數之前, float
被轉換為unsigned long long
,並且其小數部分被截斷。 std::bitset
沒有采用浮點值的構造函數。
浮點數的字節順序受機器字節序的影響 。 在little-endian計算機上,字節以相反的順序存儲。 如果您的機器對浮點數和整數使用相同的字節序,則只需編寫
float f = 0.15625f; std::uint32_t b; std::memcpy(&b, &f, 4); std::cout << std::bitset<32>(b) << std::endl; // Output: 00111110001000000000000000000000
自動以正確的順序獲取字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.