如何输出IEEE-754格式的整数为float
-
13-09-2019 - |
题
我有表示使用IEEE-754格式的浮子一个无符号长整数值。这是打印出来作为在C ++浮?
的最快捷的方式我知道的一种方式,但我不知道是否有在C ++中,这将是更好的便捷工具。
的,我知道的方式实施例是:
union
{
unsigned long ul;
float f;
} u;
u.ul = 1084227584; // in HEX, this is 0x40A00000
cout << "float value is: " << u.f << endl;
(此打印出 “浮点值是:5”)
解决方案
您提出的联合方法是普通路线,大多数人会采取。然而,它在技术上的未定义行为的在C / C ++,从比是最近写的一个工会读不同的成员。尽管这样,但是,它的几乎所有的编译器之间的良好支持。
铸造指针,如乔恩飞碟双向建议,是一个坏主意 - 这违反了的 C.一个积极的优化编译器的严格别名规则将产生不正确的代码对于这一点,因为它假设的类型的指针unsigned long *
和float *
绝不会互为别名。
在最正确的方式,在标准的符合性术语(即,而不是调用未定义的行为),是通过一个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));
虽然说实话,我只想去与工会法。从上面的cellperformance.com链接:
这是一个非常常见的成语和所有主要的编译器被很好地支持。作为一个实际问题,读出和写入一个联合的任何成员,以任何顺序,是可以接受的实践。
其他提示
将仅在32位机器或机器的工作,其中的sizeof(长)==的sizeof(浮点)。现代计算机上的你可能想int,而不是使用...你真的有,如果你正在执行这一招照顾。
我想同样的事情乔恩斯基特,但他打我给它。不过,我会做一点更简洁比他做到了。
cout << "float value is: " << *((float *) &ulValue)) << endl;
您获得一个指向你的unsigned long类型,然后重新解释,作为一个指针浮动,然后取消引用指针浮动产生的浮点值。
由于要在C ++中这样做,这是更清晰,而不是reinterpret_cast的使用旧的C风格的演员。
cout << "float value is: " << *(reinterpret_cast<float *>(&ulValue)) << endl;
编辑:我以前认为这“只是讨厌”,但事实证明是比我想象的还要糟糕 - 详见注释。我不推荐这种方法,但我要离开这里记录的可能性(和警告!)
可以使用指针:
long ul = 1084227584;
float* fp = (float*) &ul;
float f = *fp;
(这可以被浓缩成一行,但我认为它更清晰不这样做。)
基本上同样的事情,你的工会......,同样不可靠的,除非你确定所涉及的类型的大小的。
如果您的平台支持他们,你应该使用的具体尺寸,类型名称为整数和浮点类型的两个。
swegi有正确的方向,但错过一个字符。正确的方法是
long l = 1084227584L
float f = reinterpret_cast<float&>(l);