当我们从表面看,lang(64位)>float(32位),好似lang的容量比float大,这样我们就会奇怪,因为lang可隐式转换为float,float转为lang只能强制转换。
从表象看显然是奇怪的,因为java中关于类型转换是这样说的:
那么我们需要仔细分析lang与float的容量:
lang:8字节,64位,除去一位符号位,剩余尾数63位,其范围在(±)2的63次幂之间
float呢,它符合IEEE 754标准,4字节32位中,1位符号位,8位指数位,23位尾数位
那么float的范围呢,先说结论:2**-128到2**127之间
到这里用作理解已经足够的,但是关于float范围的确定我相信很多小伙伴都容易记混,下面也来说一下
folat的最大最小:
最大值取于:
符号位为正,即0,尾数全1,指数11111110(指数全1有特殊用途,故不取)
指数转10进制-127(偏移量)=127
那么最大值
1.1111111 1111111 11111111 x 2**127
这个值为 340282346638528859811704183484516925440,通常表示成 3.4028235E38
类似的,float表示的最小值:
最大值符号位置1取负即可
那么,float范围为
[-3.4028235E38, 3.4028235E38]
另外:
1.关于float的精度及范围的问题推荐这篇博文
float的精度和取值范围
2.关于Float.MIN_VALUE 和 Float.MAX_VALUE
Float.MAX_VALUE即最大值
而Float.MIN_VALUE 呢?最初以为Float.MIN_VALUE是float类型的最小值,其实根本不是,它应该叫做float类型能够表示的最小精度,它的实际定义如下:
```Java
public static final float MIN_VALUE = 1.40129846432481707e-45f;
```