尝试将NaN分配给x64处理器上的变量
*dest = *(float*)&sourceNaN;
其中
unsigned char sourceNaN[] = {00,00, 0xa0, 0x7f};
浮点指令fld和fstp(在反汇编中看到)将0xa0字节更改为0xe0。因此,目的地有一个额外的位设置。有人可以解释为什么会这样吗?这是一个Windows应用程序。
汇编语言代码:
005C9B9C mov eax,dword ptr [ebp+10h]
005C9B9F fld dword ptr [ebp-80h]
005C9BA2 fstp dword ptr [eax]
答案 0 :(得分:10)
0x7fa00000
是信号NaN(“sNaN”)。 0x7fe00000
是一个安静的NaN(“qNaN”)。我没有在x86下听说过这种行为,但是在ARM sNaNs中,当在操作中使用时会转换为qNaNs,同时引发FP异常(通常会被忽略)。看起来在这里发生了同样的事情。
好消息是,他们都是NaN。除非你特别依赖信号传递行为,否则一切都会正确。