浮动到 4 uint8_t并显示
Float to 4 uint8_t and display
我在维基百科上从浮点上阅读,我尝试打印他的位。 我使用了 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;
}
-
为了从
float
构造std::bitset
,使用std::bitset
解释器之一。这里相关的是constexpr bitset(unsigned long long val) noexcept;
在调用此构造函数之前,
float
被转换为unsigned long long
,并且其小数部分被截断。std::bitset
没有采用浮点值的构造函数。 -
浮点数的字节顺序受计算机字节序的影响。在小端计算机上,字节以相反的顺序存储。如果您的机器对浮点数和整数使用相同的字节序,您可以简单地编写
float f = 0.15625f; std::uint32_t b; std::memcpy(&b, &f, 4); std::cout << std::bitset<32>(b) << std::endl; // Output: 00111110001000000000000000000000
以自动获取正确顺序的字节。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 从值小于256的uint16到uint8的Endian安全转换
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- C++ std::矢量<uint8>填充,但不显示数据