如何获取浮点类型的二进制表示?或者我如何采用浮点数的尾数和指数?
答案 0 :(得分:2)
我不知道这是否是最好的方式,可能取决于编译器,但您可以创建一个适当大小的无符号整数和浮点类型的并集。分配float,并读取int。
答案 1 :(得分:2)
查看frexp
函数以获取有效数和指数:http://www.cplusplus.com/reference/cmath/frexp/
答案 2 :(得分:2)
你可以使用工会
union converter
{
float number;
struct
{
unsigned int mantisa : 23;
unsigned int exponent : 8;
unsigned int sign : 1;
} binary;
};
使用此结构,您可以轻松提取尾数,指数和签名数据:
union converter convert;
convert.number = 24.6;
int mantisa = convert.binary.mantisa;
int exponent = convert.binary.exponent;
int sign = convert.binary.sign;
答案 3 :(得分:1)
#include<iostream>
using namespace std;
int main(){
float test{ 9.9f };
unsigned char *print{ (unsigned char *)&test };
unsigned int mask{ 1 };
for (int i = sizeof(float) - 1; i >= 0; --i){
unsigned int temp{ print[i] };
for (int i = 7; i >= 0; --i)
cout << ((temp & (mask << i)) >> i);
}
cout << endl;
return 0;
}
表示双重类型,只是代表那两个浮点代码。
请注意,此代码仅适用于little-endian机器,我得到的输出是 01000001000111100110011001100110
答案 4 :(得分:1)
<强>小端:强>
void func(float f)
{
char arr[sizeof(f)];
char* ptr = (char*)&f;
for (int i=0; i<sizeof(f); i++)
arr[i] = ptr[i];
// Now use 'arr' as you will...
}
<强>大端:强>
void func(float f)
{
char arr[sizeof(f)];
char* ptr = (char*)&f;
for (int i=0; i<sizeof(f); i++)
arr[i] = ptr[sizeof(f)-1-i];
// Now use 'arr' as you will...
}
答案 5 :(得分:0)
如果你想获得浮点类型的二进制表示,那么使用union和std::bitset似乎是最快捷的方法。
在 C 中我们知道类型惩罚虽然联合是可以的( see my footnote here )但是在 C ++ 中它是不清楚的因此最好使用明确支持它的编译器,例如gcc which documents this support in C++。
快速实施如下( see it live ):
#include <bitset>
#include <iostream>
union floatToInt
{
float f ;
unsigned int u ;
} ;
int main()
{
floatToInt u1 ;
u1.f = 3.4f ;
std::bitset<32> bs1( u1.u ) ;
std::cout << bs1 << std::endl ;
}
具有以下结果:
01000000010110011001100110011010
如果我们将其插入IEEE 754 Converter,则会返回3.4
。