C++ C++;NaN字节表示在赋值过程中发生更改

C++ C++;NaN字节表示在赋值过程中发生更改,c++,floating-point,nan,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] 005C9

尝试将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异常(通常会被忽略)。看起来这里也发生了同样的事情


好消息是,他们都是南。除非您特别依赖于信号行为,否则一切都正常。

有什么原因不能直接从中分配吗?我很困惑。您获取地址,将其转换为
浮点*
,然后取消引用?为什么?为什么不采取不同的做法不是问题。为什么产生的浮点设置了附加位。@Bruce-因为您已经看过反汇编(您知道它存在并且知道如何找到它),除C/C++源代码外,您可能还应该显示生成的相关代码。@ventsyv问题显示了构成
sourceNaN
的确切字节。当遇到SNaN时,x86还将信令NaN转换为等效的NaN,同时屏蔽无效异常。否则,遇到SNaN时会引发该异常。SNaN通过设置尾数的最高有效小数位(IEEE-754单精度数字中的第22位)来“静音”。