浮动到int意外行为
你能解释一下这个程序的o / p行为吗?
int main() { float a = 12.5; printf("%d\n", a); printf("%d\n", *(int *)&a); return 0; }
可以请访问http://codepad.org/AQRlAzkC查看代码
为什么这个输出会来……
您不希望将float指针强制转换为整数指针。 浮点数和整数不会以相同的方式存储,如果您这样做,则不会发生转换,因此您将在屏幕上打印垃圾。 但是,如果将int值转换为float值,则compile会将float的内部类型转换为整数。 所以你应该用(int *)
替换(int *)
(int)
。
此外, %d
用于十进制(整数)值。 你想要的是第一个printf
%f
,它是浮点值。
你想要的是这个:
#include int main() { float a = 12.5; printf("%f\n", a); //changed %d -> %f printf("%d\n", (int)a); //changed *(int *)& -> (int) for proper conversion return 0; }
在这里validation: http : //codepad.org/QD4kzAC9
浮点数以IEEE 754格式存储。 当你将%d
格式说明符传递给printf()
你告诉它要查看从&a
开始的第一个sizeof(int)
字节。 那么在IEEE 754格式中,这是一堆零。
我强烈建议你阅读每个计算机科学家应该知道的关于浮点运算的内容
不同之处在于,在一种情况下,编译器正在进行隐式转换(我假设您从第一个得到12),而在第二种情况下,它采用包含浮点值的内存并将其解释为int。 如果你包括实际输出是什么会有所帮助。
转换指针和转换值是非常不同的操作。 将float转换为int时,要求将float值转换为int值,这会导致实际的数据转换; 当您将浮点指针强制转换为int指针时,您只需覆盖类型检查。 指针只是一个整数内存位置:将其转换为另一种指针不涉及任何转换。
所以,你看到的是当被视为整数时浮点的位模式是什么样的。
大多数计算机用于表示浮点数的位模式由IEEE-754标准描述。 另一方面,整数只是用二进制基数表示的整数。 因此,获取实数的位并将它们解释为整数会产生非常不同的结果。
让我们来看看。
- 浮点数以IEEE 754中定义的格式存储。请参见: http : //en.wikipedia.org/wiki/IEEE_754-2008
- 旁注:你在第一条指令中将双重传递给浮动。 这将在编译时进行,但有些编译器可能会抱怨。 如果你想使用浮点数,请附加一个f:
float a = 12.5f;
- 您将浮点数传递给%d参数。 这是不好的。 编译器在这里可能会有不同的行为,有些人可能会警告你。 如果要传入浮点数,请使用%f。
- 您正在使用IEEE-754格式的整数并将其打印出来。 请参阅第1项中的链接以查看您要打印的内容。
我认为它打印12 12因为%d没有差异而且*&a = a