前言:
整数有原码,反码,补码,而整数在计算机中存储的是二进制补码,所以我们得求出一个整数的补码,才能得知1它是如何如何在内存中存储的。
1.整数存储
这里以int类型为例:一个int类型的整数有4个byte,32个bit,它的最高位为符号位:正数为0,负数为1.
(1)正数:
原码==反码==补码
eg:20:
原码:00000000 00000000 00000000 00010100
反码:00000000 00000000 00000000 00010100
补码:00000000 00000000 00000000 00010100
故20在计算机中存储为00000000 00000000 00000000 00010100
(2)负数:
原码:原码
反码:除符号位以外,其他为按位取反(~)
补码:反码+1
eg:-20:
原码:10000000 00000000 00000000 00010100
反码:111111111 111111111 111111111 11101011
补码:111111111 111111111 111111111 11101100
故-20在计算机中存储为111111111 111111111 111111111 11101100
2.浮点数存储:
任意一个浮点数V都可以表示成下面的形式:
V =
——>表示符号位,s=0表示为正数,s=1,表示为负数
——>表示有效数字,是大于等于1小于2的(1 <= M < 2)
——>表示指数位
而浮点数存储又分为32位浮点数存储(float类型)和64位浮点数存储(double类型)
(1)32位存储:
对于32位的浮点数:最高位存储的是符号位S(1bit),其次存储的是指数E(8bit),然后存储的才是有效数字M(23bit)
(2)64位存储:
对于64位的浮点数:最高位存储的是符号位S(1bit),其次存储的是指数E(11bit),然后存储的才是有效数字M(52bit)
3.对于M与E的规定:
(1)M:
在计算机内部保存M的时候,默认这个数的第一位为1,因此可以被舍去,只保存后面小数部分。例如:在保存1.01的时候,就只保存01,等到读取的时候再把第一位的1加上去,这样做的目的:节省1位有效数字。
(2)E:
E是一个无符号整数(8bit:0~255,11bit:0~2047),对于8位bit的E,在保存E的时候需要在原来E的基础上加上127;对于11bit的E,在保存E的时候需要在原来的基础上加上1023。例如:
(float类型数据)的E为10,但在存储的时候会加上127,则E变为137,存储为01001001。
4.浮点数的读取:
(1)E全为0:
说明E原先可能为-127或者-1023,这代表该浮点数是一个非常小的数
(2)E全为1:
说明E原先很大,这代码该浮点数是一个非常大的数
(3)E不全为1/不全为0:
例如:0.5的存储:
0.5的二进制形式:0.1 ==>
E为-1(+127后为126),S为0,M为1.0,但只存储小数部分:0
则0.5存储形式为:0 01111110 00000000000000000000000