浮点数和int类型都是4个字节,我尝试以这种方式进行转换:
unsigned int x = 0; // 00000000
x = ~x>>1; // 7fffffff
float f = *((float *)&x);
printf("%f\n", f);因为c浮点数中的第一个位表示+/-,接下来的8个位是2^(exp-127)中的exp,其余的将转换为0.xxxxx...,这意味着我可以得到最大浮点数:0|11111111|111...111,但最后得到一个nan。
有什么不对劲吗?
发布于 2014-12-21 09:12:20
你接近了,但是你的指数超出了范围,所以你有一个NaN。FLT_MAX是:
0 11111110 11111111111111111111111
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm注意,最大指数是11111110,因为11111111是为NaNs保留的。
对应的十六进制值是:
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
发布于 2014-12-21 09:07:43
按位计算的IEEE浮点标准单精度(32位)NaN(不是数字)应该是:
s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
其中s是符号(在应用程序中最常被忽略),x是非零(值零编码无穷大)。
发布于 2014-12-21 09:24:04
为了获得最大float值的二进制表示,执行“反向”:
float f = FLT_MAX;
int x = *((int*)&f);
printf("0x%.8X\n",x);结果是0x7F7FFFFF (而不是您假设的0x7FFFFFFF )。
C语言标准并不规定sizeof(float) == sizeof(int).
因此您必须在您的平台上验证这一点,以确保正确的执行。
https://stackoverflow.com/questions/27588006
复制相似问题