簡體   English   中英

浮動到4 uint8_t並顯示

[英]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;
}
  1. 為了構建std::bitsetfloat的一個std::bitset construtors被使用。 這里相關的是

     constexpr bitset(unsigned long long val) noexcept; 

    在調用此構造函數之前, float被轉換為unsigned long long ,並且其小數部分被截斷。 std::bitset沒有采用浮點值的構造函數。

  2. 浮點數的字節順序受機器字節序的影響 在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM