Java中整型及浮点型数据存储范围理解
前言
最近复习Java时发现八大基本数据类型中整型浮点型数据的存储范围特别蹊跷,为什么byte的可以存储-128~127之间的数,-128是哪来的?浮点型数据底层到底是怎么存储的?遂深入研究一下,成此文。一、整型数据的存储范围理解
Java中整型数据包括byte、short、int、long,他们在底层的占用空间都是固定的,byte占用一个字节,short占用2个,int占用4个,long占用8个。byte可表示-128到127,shaort表示-2^15 到 2^ 15-1,........ 此处以byte举例,我们可以很容易的知道,byte占用一个字节,即8位,其中最高位又为符号位,所以其可以表示的最大数自然就为2^7-1=127。如下图所示,7个数据位全为1且符号位为正即得最大数,最大数加1即为2^7,所以最大数为2^7-1。
但实际上Java中byte能存储的最小数为-128,这是因为在有符号位的情况下,8位数据既会出现正0,又会出现负0,如下图所示。然而我们只需要一个0,所以Java中留下正0而将负0用于拓展最小范围,对于byte来讲,负0表示-128。其他整型数据类型是一样的。
二、浮点型数据的存储理解
java语言中,float类型数字在计算机中用4个字节(32位)来存储。double类型占用8个字节(64位)。 从存储结构和算法上来讲,double和float是一样的,采用的科学记数法表示。例如123.456可以表示成1.23456×10^2。其存储方式如下
符号位(最高位):表示正、负数。
指数部分:表示以2为底数的幂次数。此处算出的指数必须减去127才是真正的指数。
有效位:表示有效数字。
举例:
17.625在内存中的存储为:
首先要把17.625换算成二进制:10001.101。
整数部分:除以2,直到商为0,余数反转。(即:模2取余法)
17 % 2 = 8 —> 1 低位
8 % 2 = 4 —> 0
4 % 2 = 2 —> 0
2 % 2 = 1 —> 0
1 % 2 = 0 —> 1 高位
小数部分:乘以2,直到乘位为0,进位顺序取。(即:乘2取整法)
按如下算法进行:
1)首先给小数部分乘2,得到的数,如果小数点前为1;则计1,为0,则计0。
2)再对剩下的小数部分乘2,再计出1或0。
3)重复以上步骤,直至达到需要的精度。
0.625 x 2 = 1.25 —> 1 -1位
0.25 x 2 = 0.5 —> 0 -2位
0.5 x 2 = 1.0 —> 1 -3位
0.0 x 2 = 0.0 —> 0 -4位
以上得到17.625换算成二进制为10001.101。
再将10001.101右移,直到小数点前只剩1位,1.0001101 * 24 ,右移动了四位。
此时,底数和指数就出来了。
底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号:因为是正数,所以是0
综上所述,17.625在内存中的存储格式是:01000001 10001101 00000000 00000000
引用:https://www.cnblogs.com/java-script/p/11123897.html
https://blog.csdn.net/geyingzhen/article/details/107334817