将4字节int解释为4字节浮点数

时间:2015-04-24 12:14:27

标签: c++

看看这个简单的程序:

#include <iostream>
using namespace std;

int main()
{
unsigned int i=0x3f800000;
float* p=(float*)(&i);
float f=*p;
cout<<f;
}

这是我对该计划的期望:

  1. 最后一行:我们必须在输出中看到f
  2. 上一页:fp指向的值。
  3. 上一页:p指向名为i的变量地址中的值。 (即i
  4. 的值
  5. i0x3f800000
  6. 所以我希望在输出中看到0x3f800000,但它会打印1。为什么呢?

    ap1019@sharifvm:~$ ./a.out
    1
    ap1019@sharifvm:~$
    

5 个答案:

答案 0 :(得分:5)

您所做的是reinterpret_cast指向int的指针,指向float并通过转换后的指针检索float值。

一般情况下,它是未定义的行为,但在您的计算机上发生intfloat具有相同的大小,以及表示int0x3f800000的字节,也代表float1

答案 1 :(得分:2)

  

所以我希望在输出中看到0x3f800000,但它会打印1。为什么呢?

因为0x3f800000具有位模式00111111100000000000000000000000,如果根据IEEE 754 standard读取,则表示浮点1.0 enter image description here

答案 2 :(得分:1)

不要期待此代码中的任何内容。 (float*)(&i);的行为未定义,因为指针类型不相关。

floatint的大小可能不同。您可能正在开发一种架构,将floatint存储在内存中完全独立的位置。 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浮点数的位模式。

还要注意您的代码违反了严格的别名,因此无论位模式如何,都会有未定义的行为。