如何使用浮点类型的二进制表示

How can I take binary representation of float-pointing types?

本文关键字:二进制 表示 类型 何使用      更新时间:2023-10-16

如何使用浮点数类型的二进制表示?或者怎么取浮点数的尾数和指数?

查看frexp函数以获取有效和指数:http://www.cplusplus.com/reference/cmath/frexp/

我不知道这是否是最好的方法,可能取决于编译器,但您可以创建一个适当大小的无符号整数和浮点类型的联合。赋值浮点数,并读取int

可以使用联合体

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;
#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;
}
double类型的

只是替换代码中的两个浮点数。

请注意,这段代码只适用于小端机器,我得到的输出是01000001000111100110011001100110

低位优先:

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...
}

如果您想获得浮点类型的二进制表示,那么使用union和std::bitset似乎是最快的方法。

C中,我们知道类型双关语,尽管联合是可以的(参见我在这里的脚注),但在 c++ 中,这是一个不清楚的,所以最好使用一个明确支持它的编译器,如gcc,它在c++中记录了这种支持。

快速实现如下(参见):

#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转换器,就会得到3.4