看看这个简单的程序:
#include <iostream>
using namespace std;
int main()
{
unsigned int i=0x3f800000;
float* p=(float*)(&i);
float f=*p;
cout<<f;
}
这是我对该计划的期望:
f
。f
是p
指向的值。p
指向名为i
的变量地址中的值。 (即i
)i
是0x3f800000
所以我希望在输出中看到0x3f800000
,但它会打印1
。为什么呢?
ap1019@sharifvm:~$ ./a.out
1
ap1019@sharifvm:~$
答案 0 :(得分:5)
您所做的是reinterpret_cast
指向int
的指针,指向float
并通过转换后的指针检索float
值。
一般情况下,它是未定义的行为,但在您的计算机上发生int
和float
具有相同的大小,以及表示int
值0x3f800000
的字节,也代表float
值1
。
答案 1 :(得分:2)
所以我希望在输出中看到
0x3f800000
,但它会打印1
。为什么呢?
因为0x3f800000
具有位模式00111111100000000000000000000000
,如果根据IEEE 754 standard读取,则表示浮点1.0
答案 2 :(得分:1)
不要期待此代码中的任何内容。 (float*)(&i);
的行为未定义,因为指针类型不相关。
float
和int
的大小可能不同。您可能正在开发一种架构,将float
和int
存储在内存中完全独立的位置。 sizeof(float*)
与sizeof(int*)
不同,甚至可能是{{1}}。不太可能,但可能。
答案 3 :(得分:1)
从int到float的转换是错误的。 你必须这样做:
unsigned int i=0x3f800000;
float f=(float)i;
cout<<f;
答案 4 :(得分:1)
将1065353216
表示整数(十六进制为3f800000
)的位模式在您的实现中发生,表示1
为浮点数。不能保证在所有C ++实现中都会出现这种情况,尽管这是常见的,因为这是代表1
作为32位IEEE 754浮点数的位模式。
还要注意您的代码违反了严格的别名,因此无论位模式如何,都会有未定义的行为。