我对 x86(32 位)linux gcc 有奇怪的行为。我使用 gcc 的内置生成信号 NaN __builtin_nansf("")
,生成 0x7fa00000。从函数返回这个值作为浮点数后,它被修改为 0x7fe00000。有一个简短的例子:
#include <stdio.h>
float f = __builtin_nansf("");
float y;
float func (void)
{
return f;
}
int main (void)
{
printf("%x\n", *((int*)&f));
y = func();
printf("%x\n", *((int*)&y));
}
用 编译的程序gcc-4.6.2 program.c
,其输出:
7fa00000
7fe00000
数据库:
(gdb) p/x f
$2 = 0x7fa00000
...
(gdb) si
0x08048412 in func ()
1: x/i $pc
0x8048412 <func+14>: flds -0x4(%ebp)
(gdb) x/x $ebp-4
0xbfffeb34: 0x7fa00000
(gdb) si
(gdb) info all-regis
st0 nan(0xe000000000000000) (raw 0x7fffe000000000000000)
... //after return from func
(gdb) si
0x0804843d in main ()
1: x/i $pc
0x804843d <main+38>: fstps 0x804a024
(gdb) si
(gdb) x/x 0x804a024
0x804a024 <y>: 0x7fe00000
为什么我的信号 NaN 被修改了?如何防止这种修改?