考虑下面的转换代码:
 int a = 0x7fFFffff;
    int a = 0x7fFFffff;

 float fa= (float)a;
    float fa= (float)a;

 int b = static_cast<int>(fa);
    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 阅读(574) 
评论(0)  编辑 收藏 引用  所属分类: 
c++/boost