我有一个返回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 long
和float
的大小是否相同。
所以我的问题是:
如何像这样投射指针会改变指向的值?
编辑:foo()的相关部分基本上是
unsigned long foo()
{
float a = 22.4;
return *(unsigned long *)(&a) ;
}
答案 0 :(得分:2)
这是因为当传递给函数时,float首先被提升为double,因此printf需要打印一个double。由于foo
不返回浮点数,因此转换未执行,因此printf会将其他内容作为参数找到。