为什么转换此指针也会更改指向的值

时间:2017-07-17 17:01:22

标签: c casting

我有一个返回unsigned long的函数,实际上是float

我们会调用该函数unsigned long foo()

当我像这样打电话给printf时:

printf("%f", foo());

它将始终打印出0.00000

但是当我这样投出时:

unsigned long bar = foo();
printf("%f", *((float *)(&bar)));

它正确输出浮动。

使用"%x"进行打印我可以看到二进制表示形式不同。令人惊讶的是,unsigned long版本看起来更像是一个实际的浮点表示(41ba019a vs 40000000

我在我的系统上仔细检查了unsigned longfloat的大小是否相同。

所以我的问题是:

如何像这样投射指针会改变指向的值?

编辑:foo()的相关部分基本上是

unsigned long foo()
{
  float a = 22.4;
  return *(unsigned long *)(&a) ;
}

1 个答案:

答案 0 :(得分:2)

这是因为当传递给函数时,float首先被提升为double,因此printf需要打印一个double。由于foo不返回浮点数,因此转换未执行,因此printf会将其他内容作为参数找到。