Tom*_*Tom 4 c++ data-conversion ieee-754
我有一个无符号长整数值,表示使用IEEE-754格式的浮点数.在C++中以float形式打印它的最快方法是什么?
我知道一种方法,但我想知道在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")
你建议的联合方法是大多数人会采用的通常方法.但是,在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链接:
这是一个非常常见的习惯用语,得到了所有主要编译器的良好支持.实际上,以任何顺序读取和写入工会的任何成员都是可以接受的做法.