目录
一,整型在内存中的存储
1.计算机中的整数有三种表示方法,即原码、反码和补码
无符号整数,有符号正整数在内存中的原码,反码,补码相同。
有符号负整数在内存中的原码,反码,补码不同,具体转换方式如下:
整数在内存中存放的是补码,计算时使用的也是补码。原因:补码可完成对符号位的运算以及减法运算。下面举例说明:
2.数据在内存中的大小端存储
大小端存储是针对类型大小超过1个字节的数据的存储方式,注意如果数据大小为1个字节,那么该字节内部的数据不需要按照大小端存储。
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中。
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地
址中。
以上两种存储模式是针对数据类型大于1个字节的数据的存储。不同的编译器数据存储模式不同,当前我所用的vs2019上用的是小端存储。高位放高地址,地位放低地址。
3.char类型在内存中可存放数据的范围
如图:
为方便读者理解,特有下图参考:
同样int类型,short类型也是如此存储。
二,浮点型在内存中的存储
首先一个浮点数可以用二进制的方式表示,例如5.5:
V=5.5=101.1
=1*2^2+0*2^1+1*2^0+1*2^-1
小数点前的二进制位正常计算,小数点后的二进制位为2^-1,2^-2……
因此将小数点往前移动两位,v=1.011*2^2,类似十进制的移动只不过是乘以一个2^n。
由以上可知5.5用二进制可表示为1.011*2^2,那么在计算机系统中是如何存储这个数据的呢?
1.011*2^2可写成(-1)^0*1.011*2^2,类似于(-1)^s*m*2^E,而存储到计算机内存的是s,m,E三个数据,具体存储方式我们可以5.5的存储举例:
对于float型数据,最高的1位存储的是符号位s,接着的8位是指数E,剩下的23位为有效数字m。
对于double型数据,最高的1位是符号位s,接着的11位是指数E,剩下的52位为有效数字m。
接下来我们具体说明s,E,m是如何存储在内存中的:
1.首先是符号位s,其保存在第一位,不管是float还是double。5.5的s=0,所以5.5在内存中存储的第一位是0.
2.有效数字m的存储,由于m是大于1小于2的数,因此计算机为节省内存,通常不会存小数点前的数字1,而是将这23个bit位(double类型是52个)全部用来存储小数点后的数字,如果位数不够则就在后面补0.而5.5的m=1.011,因此其在内存中存放的是01100000000000000000000.
3.指数E的存储,由于E是一个无符号数,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存10+127=137,即10001001;再比如2^-2,保存成32位浮点数时,保存的是-2+127=125,即0111 1101。5.5的E=2,其存在内存中时,先将2+127,得到129,再将129的二进制序列1000 0001存在内存中。
而E取出是又分为3种情况:
1.E存到内存中的数据不全为1或0
即正常的取出,先根据二进制位计算出E的计算值,再将指数E的计算值减去127(或1023),得到真实值。再将有效数字m前加上第一位的1.例如E=-2时,其在内存中存放的时01111101,先根据这个二进制序列计算出125,再用125减去127,便得到E的真实值-2。
2.E全为0
这时E存在内存中的8(11)个bit位全为0,其拿出来时E真实值为1-127(或者1-1023)。有效数字m不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于
0的很小的数字
3.这时E存在内存中的8(11)个bit位全为1,拿出来时E的真实值为128.这时,如果有效数字m全为0,表示±无穷大(正负取决于符号位s)
通过以上说明我们可以知道5.5在内存中的存储形式是什么样的,如下图: