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
。
那有什么不对吗?
答案 0 :(得分:3)
你很近,但你的指数超出范围,所以你有一个NaN
。 FLT_MAX
是:
0 11111110 11111111111111111111111
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
请注意,最大指数为11111110
,11111111
为NaN
保留。
相应的十六进制值为:
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)
。
因此,您必须在平台上验证这一点,以确保正确执行。