计算机数的表示法

文章理解自这里算法

前提:计算机的运算器中只有加法器没有减法器。数据在计算机中是二进制表示的。spa

想固然的原码表示法:

1:用符号位区分正负数
2:正数-正数 == 正数 + 正数的相反数:1 - 1 = 1 + (-1) = 0
.net

假如咱们有一个4位的机器,由于数字有正负数和零值,所以想固然的咱们把最高位设置为符号位0表明正数,1表明负数,后面位为二进制数值的表示,例如1:0001,-1:1001,这种表示法即为原码。
下面咱们来验证原码表示法的实用性:
code

正数+正数:0001+0010=0011 (1+2=3)
零 + 零:0000+1000=1000 (+0+(-0)=-0)
正数加负数:0001+1001=1010 (1+(-1)=-2)×

blog

从结果中咱们发现,当没有减法器时这种想固然的数值存储方法(原码)并不能正确的计算减法。
那怎么办呢?
get

利用同余概念的补码表示法:

在原码表示法中咱们试图使用加一个数的相反数的方法解决减法问题,却碰了壁。还有没有能够避开减法器的加法操做呢?是有的,那就是同余法。class

基础概念

模:这里的模能够理解成能够表示的数的个数。好比四位二进制,能够表示0000——1111,共16个数,那么就是模16。一位二进制最大能够表示的数是1,可是能够表示两个数,因此模2。基础

同余数:当前数 + 当前数的同余数 = 模, 同余数 = 模 - 当前数硬件

基本思想

对于数值有限制,有溢出的运算(模运算)来讲,减去一个数,其实也至关于加上这个数的同余数。二进制

栗子:

若是说如今时针如今停在10点钟,那么让它指向八点钟呢?
方法1:10点 - 2(小时) = 8(点),也就是倒回去(减去)两个小时。
方法2:10点 + 10(小时)= 8(点),也就是走到明天8点。这里的模就是12小时。

存储表示:

  1. 不须要符号位
  2. n 位存储的模 = n 2 n^2 n2

来看一下这种表示方法的实用性:

正数 + 正数:0110 + 0010 = 1000 (6 + 2 = 8)
正数 + 同余数:0110(6)- 0010(2)=0110(6)+ 1110(14)=10100(20×:由于是4位存储,因此只能获得0100 = 4 ,因此

看来。。。仍是错的。可是!咱们看到按照这种算法得出的结果是10100,可是对于四位二进制数,最大只能存放4位(硬件决定了),若是咱们低四位,正好是0100(4),正好是咱们想要的结果,至于最高位的‘1’,计算机会把他放入psw寄存器进位位中。8位机则会放在cy中,x86会放在cf中(这个咱们不做讨论)

简略记忆:

原码
最高位为符号位,0表明正数,1表明负数,非符号位为该数字绝对值的二进制表示。

如:

127的原码为0111 1111
-127的原码为1111 1111

反码
正数的反码与原码一致;

负数的反码是对原码按位取反,只是最高位(符号位)不变。

如:

127的反码为0111 1111
-127的反码为1000 0000

补码
正数的补码与原码一致;

负数的补码是该数的反码加1。

如:

127的补码为0111 1111
-127的补码为1000 0001

总结一下就是:

正数的原码、反码、补码是一致的;

负数的补码是反码加1,反码是对原码按位取反,只是最高位(符号位)不变;

计算机数字运算均是基于补码的。

相关文章
相关标签/搜索