随笔 - 21  文章 - 0  trackbacks - 0
<2025年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

考虑下面的转换代码:

    int a = 0x7fFFffff;

    
float fa= (float)a;

    
int b = static_cast<int>(fa);

a是最大的int最大值为 0x7fffffff 

第二个语句将int转换为float fa,

第三个语句再将float转换回来为int,

最后b的值确是 -2147483648 .

下面分析过程
查看fa的二进制0x4f000000,将float表示转换为二进制,并按float位划分表示

s     指数位           尾数位
0    1001 1110    00000000000000000000000

指数值为 0x9e,转换实际值 0x9e-127 = 31,这样计算下来fa的值就是2^31。
可最开始a转为fa时候赋值是 0x7fffffff = 2^31-1,恰好是这个多出来1的导致最后转换回b的值变成了负数。

这个1咋多出来的呢?

这要看从a转换到fa过程中发生了什么。

将a 0x7fffffff按照float 规范方式表达为二进制:

    30个1  
1. 11...111 * 2^30

但因为float的尾数只有23bit位,所以这里a的小数点后的30位只能保留23位了。

按照最接近拾入规则,会在最后一个bit补上了1,
                   23bit   24bit   30bit
1. 1111....1   1         1....     1

得到的拾入后的值为
10. 000...00 (23位0)*2^30

也就是2^31了。这个值用int解读也就是变成int最小值了。

结论:

int到float的转换会因为精度的原因产生各种不一致。





posted on 2014-07-12 21:05 pizzx 阅读(526) 评论(0)  编辑 收藏 引用 所属分类: c++/boost

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理