C++ 分配期间 NaN 字节表示形式发生变化

C++ NaN byte representation changes during assignment

本文关键字:变化 表示 字节 分配 NaN C++      更新时间:2023-10-16

尝试将 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。除非你特别依赖信令行为,否则一切都会顺利进行。