在Java语言中,我们知道基本数据类型包括整型、浮点型、字符型(char)以及布尔型(boolean)。其中整型包含(byte、short、int、long)和浮点类型(float、double)。
long型占用8个字节的存储空间,即64bit,最左边一位是符号位,0表示正,1表示负,其余23位存储数值,所以long的范围最大是2^31(2的31次方),最小的就是2^31-1。这个很好理解,而float型占用4个字节,即32bit,所表示的数值范围为-3.403E38到3.403E38,这个数值范围是要大于long型所表示的数值范围的。为什么会这样呢?要搞懂这个问题,就先要明白float型是如何存储的。
对于浮点类型的数据采用单精度类型(float)和双精度类 型(double)来存储,float数据占用32bit,double数据占用64bit。通常
- float可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度
- double可以保证十进制科学计数法小数点后15位有效精度和第16位的部分精度。
无论是单精度还是双精度在存储中都分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且要加上偏移量(float偏移127,double偏移量1023)
- 尾数部分(Mantissa):尾数部分
其单精度float的存储方式如下图所示:
long是整型,是8个字节,1byte = 8bit,那8个字节就是32位。
32位的二进制最大的数就是32位二进制数全为1:11111111111111111111111111111111
该二进制数也可以用2的次方表示:2^31次方(因为二进制数从右向左用2的次方表示是从2的0次方开始)。
那么long的范围最大是2^31(2的31次方),最小的就是2^31-1.
所以long的范围最大是2^31(2的31次方),最小的就是2^31-1。而浮点数float的最大值是1*2^127;那么最小值就是-1*2^127
由此可见,四个字节的浮点数float范围比八个字节的整数范围大。