为什么float4个字节比long8个字节所表示的数值范围还大?
引言
在Java语言中,我们知道基本数据类型包括数值型、字符型以及布尔型。其中数值型包括整数类型(byte、short、int、long)和浮点类型(float、double)。long型占用8个字节的存储空间,即64bit,最左边一位是符号位,0表示正,1表示负,其余63位存储数值,所以long型可以表示的数值范围为-263到263-1。这个很好理解,而float型占用4个字节,即32bit,所表示的数值范围为-3.403E38到3.403E38,这个数值范围是要大于long型所表示的数值范围的。为什么会这样呢?要搞懂这个问题,就先要明白float型是如何存储的。
float型的存储方式
为了方便说明,这里借用维基百科中【单精度浮点数】定义[1]中的一张图。
其中,左边第一位为符号位,0表示正,1表示负。上图中sign为0,所以为正数。
中间8bit表示指数,但是这里和byte不同,byte型也是8bit,表示的数值范围是-27到27-1,即-128到127。这里exponent的8bit表示的则是-127到128。在IEEE 754(IEEE二进制浮点数算术标准)[2]中规定,在指数的实际值