1.1引出问题
float是4个字节,也就是32位二进制
long是8个字节,也就是64位二进制
那为什么float的取值范围比long大呢?
先来看一段代码,证明确实float的取值范围比long大
1.2代码段
float x = 0.1f;
long y = 123456;
x=y; //自动转换
System.out.println(x);
y=(long)x; //强制转换
System.out.println(y);
运行结果
通过强制转换和自动转换的定义可以看出,float确实比long大
1.3float的储存方式
------------图片转载自wiki百科
1. 第31位放符号位,0为正数,1为负数
2.第30~23位为指数位
3.第22~0位为尾数位
举例:存储123.5
(12.5)D=(1100.1)B=1.1001*2的3次方
符号位为0,指数位为3+127=130,转换为二进制=10000010,尾数为1001
那么在内存中存储的数为01000001010010000000000000000000
1.4解释原因
那么可以得到尾数为 0.1111111 11111111 11111111,指数为 11111111,但是指数全为1时有其特殊用途,所以指数最大为 11111110,指数减去127得到127,所以最大的数字就是1.1111111 1111111 11111111 x 2 127 2^{127}2
127
,这个值为 340282346638528859811704183484516925440,通常表示成 3.4028235E38,那么float的范围就出来了:[-3.4028235E38, 3.4028235E38]
而long的取值范围【-2*10的63次方,2*10的63次方-1】
综上所述,因为float的特殊存储方式,所以32位的float取值范围比64位的long大