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

Bru*_*uce 9 c++ floating-point nan

尝试将NaN分配给x64处理器上的变量

*dest = *(float*)&sourceNaN;
Run Code Online (Sandbox Code Playgroud)

哪里

unsigned char sourceNaN[] = {00,00, 0xa0, 0x7f};
Run Code Online (Sandbox Code Playgroud)

浮点指令fld和fstp(在反汇编中看到)将0xa0字节更改为0xe0.因此,目的地有一个额外的位设置.有人可以解释为什么会这样吗?这是一个Windows应用程序.

汇编语言代码:

005C9B9C  mov         eax,dword ptr [ebp+10h]  
005C9B9F  fld         dword ptr [ebp-80h]  
005C9BA2  fstp        dword ptr [eax] 
Run Code Online (Sandbox Code Playgroud)

Sne*_*tel 11

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

好消息是,他们都是NaN.除非你特别依赖信号行为,否则一切都正常.

  • 当掩码无效异常时,x86还会在遇到SNaN时将信令NaN转换为等效的NaN.否则在遇到SNaN时会引发异常.通过设置尾数的最重要的小数位(其是IEEE-754单精度数中的位22)来"静音"SNaN. (6认同)