首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么结果是nan在这个c浮点转换?

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

Stack Overflow用户
提问于 2014-12-21 09:00:25
回答 3查看 447关注 0票数 4

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

代码语言:javascript
复制
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

有什么不对劲吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-21 09:12:20

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

代码语言:javascript
复制
0 11111110 11111111111111111111111
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

注意,最大指数是11111110,因为11111111是为NaNs保留的。

对应的十六进制值是:

代码语言:javascript
复制
0x7f7fffff

所以你的代码应该是:

代码语言:javascript
复制
unsigned int x = 0x7f7fffff;
float f = *((float *)&x);
printf("%f\n", f);

其结果是:

代码语言:javascript
复制
3.4028235E38

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

票数 3
EN

Stack Overflow用户

发布于 2014-12-21 09:07:43

按位计算的IEEE浮点标准单精度(32位)NaN(不是数字)应该是:

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

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

票数 2
EN

Stack Overflow用户

发布于 2014-12-21 09:24:04

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

代码语言:javascript
复制
float f = FLT_MAX;
int x = *((int*)&f);
printf("0x%.8X\n",x);

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

C语言标准并不规定sizeof(float) == sizeof(int).

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27588006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档