系统支持把某种基本数据类型直接赋值给另一种基本类型的变量,这杯称为自动类型转换。
对于byte→int类型的这种我们都能理解。但为什么64位的long类型能自动转换为32位的float类型?不知道大家想过没。- long b=311111111L;
- float a=b;
- System.out.println(a);
复制代码 上面代码是没有问题的,但打印就会发现float丢失了精度打印结果为3.11111104E8;
float 的32位 在IEEE754标准下 是第一位为符号位,后面8位为指数位,最后23位才为尾数。
上面的b明显大于了2的23次方,所会丢失精度。下面是java的float转int方法的代码。
也就是说我们表示精度的只有尾数(最大为2的23次方减1)。而表示大小的则有2的8次方减1即255.
又因为java把指数为255作为判断无穷的标准.所以能表示的最大为尾数乘以2的(254-150)次方。
这显然比long类型的能表达的2的63次方减1大。所以是可以直接转换的。
|