浮到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;
}
要从 float
构造 std::bitset
,使用 std::bitset
construtors 之一。与这里相关的是
constexpr bitset(unsigned long long val) noexcept;
在调用此构造函数之前,float
被转换为unsigned long long
,其小数部分被截去。 std::bitset
没有采用浮点值的构造函数。
浮点数的字节顺序是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
自动获取正确顺序的字节。
我从 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;
}
要从
float
构造std::bitset
,使用std::bitset
construtors 之一。与这里相关的是constexpr bitset(unsigned long long val) noexcept;
在调用此构造函数之前,
float
被转换为unsigned long long
,其小数部分被截去。std::bitset
没有采用浮点值的构造函数。浮点数的字节顺序是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
自动获取正确顺序的字节。