float和int转换拾入分析

float和int转换拾入分析
考虑下面的转换代码:

     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的转换会因为精度的原因产生各种不一致。





你可能感兴趣的:(float和int转换拾入分析)