请你解释一下这个程序的o / p行为。
int main()
{
float a = 12.5;
printf("%d\n", a);
printf("%d\n", *(int *)&a);
return 0;
}
请您在http://codepad.org/AQRlAzkC检查代码 为什么这个输出会来......
答案 0 :(得分:4)
您不希望将float指针强制转换为整数指针。浮点数和整数不会以相同的方式存储,如果您这样做,则不会发生转换,因此您将在屏幕上打印垃圾。但是,如果将int值转换为float值,则compile会将float的内部类型转换为整数。因此,您应该将(int *)
替换为(int)
。
此外,%d
用于十进制(整数)值。你想要的是第一个%f
的{{1}},它是浮动值。
你想要的是这个:
printf
答案 1 :(得分:2)
浮点数存储在IEEE 754 format中。当您将%d
格式说明符传递给printf()
时,您要告诉它查看从sizeof(int)
开始的第一个&a
字节。在IEEE 754格式中,这是一堆零。
我强烈建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic
答案 2 :(得分:0)
不同之处在于,在一种情况下,编译器正在执行隐式转换(我假设您从第一个获得12),而在第二种情况下,它采用包含浮点值的内存并将其解释为int。如果你包括实际输出是什么会有所帮助。
答案 3 :(得分:0)
转换指针并转换值是非常不同的操作。将float转换为int时,要求将float值转换为int值,这会导致实际的数据转换;当您将浮点指针强制转换为int指针时,您只需覆盖类型检查。指针只是一个整数内存位置:将它转换为另一种指针不涉及任何转换。
所以,你看到的是当被视为整数时浮点的位模式是什么。
大多数计算机用来表示浮点数的位模式由IEEE-754标准描述。另一方面,整数只是用二进制基表示的整数。因此,取实数的位并将它们解释为整数会产生非常不同的结果。
答案 4 :(得分:0)
让我们看看。
float a = 12.5f;
答案 5 :(得分:-3)
我认为它会打印出来 12 12因为%d没有差异而且*& a = a