浮动到 4 uint8_t并显示

Float to 4 uint8_t and display

本文关键字:显示 uint8      更新时间:2023-10-16

我在维基百科上从浮点上阅读,我尝试打印他的位。 我使用了 std::bitset,这返回了与我预期的不同的其他位(我知道,因为我在链接中使用了相同数量的示例(,然后我使用 memcpy(( 并将 float 的内存复制到 4 个部分,每个部分 1 个字节并打印,这种方法有效,但我有 4 个问题。

1(为什么在浮点数中使用bitset,这只打印整数部分?
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. 为了从float构造std::bitset,使用std::bitset解释器之一。这里相关的是

    constexpr bitset(unsigned long long val) noexcept;
    

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

  2. 浮点数的字节顺序受计算机字节序的影响。在小端计算机上,字节以相反的顺序存储。如果您的机器对浮点数和整数使用相同的字节序,您可以简单地编写

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

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