C ++ NaN字节表示在赋值期间更改

时间:2014-12-02 21:23:28

标签: c++ floating-point nan

尝试将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] 

1 个答案:

答案 0 :(得分:10)

0x7fa00000是信号NaN(“sNaN”)。 0x7fe00000是一个安静的NaN(“qNaN”)。我没有在x86下听说过这种行为,但是在ARM sNaNs中,当在操作中使用时会转换为qNaNs,同时引发FP异常(通常会被忽略)。看起来在这里发生了同样的事情。

好消息是,他们都是NaN。除非你特别依赖信号传递行为,否则一切都会正确。