我的心理感知告诉我,eyex
被宣布为int
,而不是double
,因为它应该是。当你给它赋值-1000.0时,它被截断为整数-1000(你的编译器应该在这里给你一个警告),它用二进制补码表示法以二进制表示为0xFFFFFC18。同样,假设eye
也是一个整数,它的值0以二进制表示为0x00000000。
当你通过eyex
,eyey
,以及其他参数printf
,使它们依靠在内存中的地址增加他们得到压入堆栈。所以之前的call
指令调用子程序,栈帧看起来是这样的:
<top of stack>
0xFFFFFC18 ; eyex
(4-8 bytes) ; vx
0x00000000 ; eyey
(4-8 bytes) ; vy
(4-8 bytes) ; vz
当printf
看到%f
格式说明,上面写着“需要8个字节从堆栈中,将其解释为一个double
值,并打印出double
值“。所以它看到值0xFFFFFC18xxxxxxxx,其中xxxxxxxxx是info->vx
的值。无论那个值如何,这是NaN的IEEE 754表示,或者“不是数字”。它有符号位设置,所以有些实现可能会选择将其解释为“负NaN”,虽然它具有与常规NaN相同的语义。
你的编译器也应该在这里警告你,你将错误类型的参数传递给printf
-它的期望值为double
,但是你没有通过它。 GCC通过-Wall
启用这些警告,我强烈建议启用这些警告。
因此,解决方案是声明eyex
的类型为double
(假设其他变量也是double
,如果它们尚未)。或者,如果您不控制eyex
等的定义(比如说,因为它们是第三方库结构的一部分),那么您应该使用%d
修饰符将其打印出来它们是整数,而不是%f
,您还应该为它们指定整数值,例如-1000和0,而不是浮点值,例如-1000.0和0.0。
由于printf会破坏类型系统,所以当您提出有关printf的问题时,您需要指定变量的类型。 – 2011-03-12 14:09:30
'-nan'可能意味着你有一个零除。 – 2011-03-12 14:09:31
@Paul他分配变量,然后立即将它传递给printf。 – 2011-03-12 14:15:27