0

我在某处看到这是一种特殊情况,+NaN 从 0x7F800001 变为 0x7FFFFFFF。答案是+NaN吗?

4

2 回答 2

2

如果您解释7FFFFFFF为 IEEE754 32 位浮点数,那么是的,7FFFFFFF是 NaN。您可以通过查看 Wikipedia page for Single-precision floating-point format来理解这些内容。我写了这个小 C 程序来说明这一点:

#include <stdio.h>

int main(){

  unsigned u0 = 0x7FFFFFFF;
  unsigned u1 = 0x7F800001;
  unsigned u2 = 0x7F800000;
  unsigned u3 = 0x7F7FFFFF;

  // *(float*)&u0 causes the data stored in u0 to be interpreted as a float
  printf("%e\n", *(float*)&u0);  // This gives nan
  printf("%e\n", *(float*)&u1);  // This also gives nan
  printf("%e\n", *(float*)&u2);  // This gives inf
  printf("%e\n", *(float*)&u3);  // This gives 3.402823e+38, the largest possible IEEE754 32-bit float

  // The above code only works because sizeof(unsigned)==sizeof(float)
  printf("%u\t%u\n", sizeof(unsigned), sizeof(float));

  // Remember that nan is only for floats, u0 is a perfectly valid unsigned.
  printf("%u\n", u0);            // This gives 2147483647

}

再次,必须提到 NaN 仅作为浮点数存在。

于 2012-10-01T20:18:15.003 回答
0

+NaN 是浮点数的特殊值(它没有等效的十进制数。它是“非数字”)。如果您只想要整数的十进制表示,它具有 7FFFFFFF 作为十六进制表示,则不涉及浮点,也没有 +NaN

于 2012-10-01T19:55:38.260 回答