如何输出IEEE-754格式的整数作为浮点数

Tom*_*Tom 4 c++ data-conversion ieee-754

我有一个无符号长整数值,表示使用IEEE-754格式的浮点数.在C++中以flo​​at形式打印它的最快方法是什么?

我知道一种方法,但我想知道在C++中是否有一个方便的实用程序会更好.

我知道的方式示例如下:

union
{
    unsigned long ul;
    float f;
} u;

u.ul = 1084227584; // in HEX, this is 0x40A00000

cout << "float value is: " << u.f << endl;
Run Code Online (Sandbox Code Playgroud)

(这打印出"浮动值为:5")

Ada*_*eld 7

你建议的联合方法是大多数人会采用的通常方法.但是,在C/C++中,从联合中读取不同的成员而不是最近编写的成员,在技术上是未定义的行为.尽管如此,它在几乎所有编译器中得到了很好的支持.

正如Jon Skeet建议的那样,转换指针是一个坏主意 - 这违反了C 的严格别名规则.积极的优化编译器将为此产生不正确的代码,因为它假定类型的指针unsigned long *并且float *永远不会互为别名.

在标准兼容性方面(即,不调用未定义的行为),最正确的方法是强制转换a char*,因为严格的别名规则允许char*指向别名的指针指向任何其他类型的指针:

unsigned long ul = 0x40A00000;
float f;
char *pul = (char *)&ul;  // ok, char* can alias any type
char *pf = (char *)&f;    // ok, char* can alias any type
memcpy(pf, pul, sizeof(float));
Run Code Online (Sandbox Code Playgroud)

老实说,我会选择union方法.从上面的cellperformance.com链接:

这是一个非常常见的习惯用语,得到了所有主要编译器的良好支持.实际上,以任何顺序读取和写入工会的任何成员都是可以接受的做法.