float类型的取值范围为什么大于long类型

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大


版权声明:本文为flyshuaibi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。