浮到4uint8_t并显示

Float to 4 uint8_t and display

我从 Wikipedia 中的 float 中读取并尝试打印他的位。 我使用 std::bitset 和这个 return 其他位与我预期的不同(我知道因为我在 link 中使用了相同数量的示例),然后我使用 memcpy() 并复制将float的内存分为4个部分,每个部分1个字节并打印,这个方法有效,但我有4个问题。

1) 为什么在float中使用bitset,这样只打印整数部分?
2) 为什么 bitset 只适用于数组而不适用于浮点数?
3) memcpy() 以正确的顺序工作?

最后一题是因为0.15625f == 0b00111110001000000000000000000000.
那么我认为正确的顺序是:

bb[0] == 0b00111110;
bb[1] == 0b00100000;
bb[2] == 0b00000000;
bb[3] == 0b00000000;

但是returned的顺序是相反的。

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. 要从 float 构造 std::bitset,使用 std::bitset construtors 之一。与这里相关的是

    constexpr bitset(unsigned long long val) noexcept;
    

    在调用此构造函数之前,float被转换为unsigned long long,其小数部分被截去。 std::bitset 没有采用浮点值的构造函数。

  2. 浮点数的字节顺序是affected by machine endianness。在小端机器上,字节以相反的顺序存储。如果你的机器对浮点数和整数使用相同的字节顺序,你可以简单地写

    float f = 0.15625f;
    std::uint32_t b;
    std::memcpy(&b, &f, 4);
    std::cout << std::bitset<32>(b) << std::endl; 
    // Output: 00111110001000000000000000000000
    

    自动获取正确顺序的字节。