如何获取浮点类型的二进制表示?

时间:2014-07-09 15:53:50

标签: c++ floating-point

如何获取浮点类型的二进制表示?或者我如何采用浮点数的尾数和指数?

6 个答案:

答案 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