数据在计算机中的存储方式
1.整数,通过补码存储在内存中。
原码:
以8bits的数00001111为例,原码就是以第1位作符号位,后7位为数据位。所以这个数字就是表示15。原码虽然简单易懂,但是也有一个很大的缺点,就是异号两个数字相加时,很麻烦,需要进行减法,然后还要根据数字的绝对值大小,大数减去小数,然后还要判断符号。
补码:
补码表示法的最大优点是,可以将加减法运算全部统一为加法运算,简化了计算机的设计,同时提高了运算效率(计算机做加法运算快于做减法运算。)
为了解决原码的缺陷,提出了补码以10001111为例,它的第1位依旧是符号位,只不过,它的真值并不是后7位直接转为十进制得到的15,而是通过-1*2^7+15=-128+15=-113。
那么补码是如何解决原码做减法时的缺陷呢,其实它基于一个很简单的原理,对于一个8位二进制补码格式的数来说,它表示的数的范围是:-128-127。将这些数连续分布到圆环上,那么对于x这个值,总可以找到y和z,使得x+y和x-z指向的数值一样。如下图:
原码的减法x-y,有以下几步:
- 判断两个数x,y的绝对值大小。
- 大数减小数。(数值位相减,要考虑借位…)
- 判断符号。
补码的减法x-y,有以下几步:
-
根据y的补码求出[-y]补,方法很简单,y全部位取反,再在末尾加1。
-
然后计算x+[-y]补。
很显然使用补码计算减法更加快速,简单。
拓展:
变形补码:为了方便检测加法或减法有没有溢出,创新了变形补码。即符号位有两位,正数:00,负数11,正溢出01,负溢出10。
根据符号位进位Cf和最高有效位进位C0判断有无溢出:v=Cf异或C0。Cf=1且C0=0产生负溢出,Cf=0且C0=1产生正溢出。
反码:
根据补码的定义,求一个负数的补码还是需要做减法,于是引入反码。
计算方法:
- 负数---->原码
- 原码---->反码:原码符号位为1不变,其余每一位按位求反得到反码。
- 反码---->补码:符号位为1不变,反码最低位加1。得到补码。
移码:
常用与浮点数的阶码。
2.浮点数
统一采用IEEE754标准的格式,S+E+M存放浮点数
S为符号位,E为阶码,M为尾数。
计算公式为x=(-1)^S * (1.M) * 2^(E-127)
S为符号位,E为阶码,M为尾数。
计算公式为x=(-1)^S * (1.M) * 2^(E-127)
就是通过数字E来控制M中小数点的位置,来表示真值。