浮动到int意外行为

时间:2010-12-18 19:35:17

标签: c floating-point

请你解释一下这个程序的o / p行为。

int main()
{
  float a = 12.5;
  printf("%d\n", a);
  printf("%d\n", *(int *)&a);
  return 0;
} 

请您在http://codepad.org/AQRlAzkC检查代码 为什么这个输出会来......

6 个答案:

答案 0 :(得分:4)

您不希望将float指针强制转换为整数指针。浮点数和整数不会以相同的方式存储,如果您这样做,则不会发生转换,因此您将在屏幕上打印垃圾。但是,如果将int值转换为float值,则compile会将float的内部类型转换为整数。因此,您应该将(int *)替换为(int)

此外,%d用于十进制(整数)值。你想要的是第一个%f的{​​{1}},它是浮动值。

你想要的是这个:

printf

在此验证:http://codepad.org/QD4kzAC9

答案 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)

让我们看看。

  1. 浮点数以IEEE 754中定义的格式存储。请参见:http://en.wikipedia.org/wiki/IEEE_754-2008
  2. 旁注:你在第一条指令中将双重传递给浮动。这将在编译时进行,但有些编译器可能会抱怨。如果您要使用浮点数,请附加f:float a = 12.5f;
  3. 您将浮动传递给%d参数。这是不好的。编译器在这里的行为可能不同,有些人可能会警告你。如果要传入浮动,请使用%f。
  4. 您正在使用IEEE-754格式的整数并将其打印出来。请参阅第1项中的链接以查看您要打印的内容。

答案 5 :(得分:-3)

我认为它会打印出来 12 12因为%d没有差异而且*& a = a