C++ C++;NaN字节表示在赋值过程中发生更改
尝试将NaN分配给x64处理器上的变量时出错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
*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位)来“静音”。