为什么在这个c浮点转换中结果是nan?

时间:2014-12-21 09:00:26

标签: c types

float和int类型都是4个字节,我尝试以这种方式进行转换:

unsigned int x = 0; // 00000000
x = ~x>>1; // 7fffffff
float f = *((float *)&x);
printf("%f\n", f);

因为c float number中的第一位代表+/-,而exp中的后8位是2^(exp-127),其余的将转换为0.xxxxx...,这意味着我可以得到最大浮点数:0|11111111|111...111但最后得到nan

那有什么不对吗?

3 个答案:

答案 0 :(得分:3)

你很近,但你的指数超出范围,所以你有一个NaNFLT_MAX是:

0 11111110 11111111111111111111111
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

请注意,最大指数为1111111011111111NaN保留。

相应的十六进制值为:

0x7f7fffff

所以你的代码应该是:

unsigned int x = 0x7f7fffff;
float f = *((float *)&x);
printf("%f\n", f);

,结果将是:

3.4028235E38

如果您对IEEE-754格式感兴趣,请查看这个方便的在线计算器,该计算器可在二进制,十六进制和浮点格式之间进行转换:http://www.h-schmidt.net/FloatConverter/IEEE754.html

答案 1 :(得分:2)

逐位IEEE浮点标准单精度(32位)NaN(非数字)将是:

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

其中s是符号(通常在应用程序中被忽略),x非零(零值编码无穷大)。

答案 2 :(得分:2)

为了获得最大float值的二进制表示,执行"反向":

float f = FLT_MAX;
int x = *((int*)&f);
printf("0x%.8X\n",x);

结果为0x7F7FFFFF(而不是您假设的0x7FFFFFFF)。

C语言标准没有规定sizeof(float) == sizeof(int)

因此,您必须在平台上验证这一点,以确保正确执行。