尝试将 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]
最佳答案
0x7fa00000
是一个信号 NaN(“sNaN”)。 0x7fe00000
是一个安静的 NaN(“qNaN”)。我没有听说过 x86 下的这种行为,但在 ARM 下,sNaN 在操作中使用时会转换为相应的 qNaN,同时引发 FP 异常(通常被忽略)。看起来这里正在发生同样的事情。
好消息是,它们都是 NaN。除非您特别依赖信号行为,否则一切正常。
关于C++ NaN 字节表示在赋值期间发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259234/