原码,反码,补码

书本定义

1.我们在教科书上所见到的定义如下:

  原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。
  机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。
  机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。

依然是教科书式的解释,没有告诉我们为什么会出现反码,为什么会出现补码。在我google了多篇文章之后,做出此篇总结。

2.在维基百科中我们可以看到机器数的进化历史,通过这里我们可以看到,在以前的计算机中都是有用到三种机器数的,而现代计算机中都是用补码进行计算,但是在这篇百科中没有详细的告诉我们补码是如何出现的。要理解补码的出现我们需要了解一些其他知识:

  • 计算机字长

计算机字长

字长就是计算机一次所能处理的最大一段二进制代码的长度。

  模就是指计数的一个容量,比如说时钟,它的模就是12,因为每当超过12之后就又从1开始了,它的容量就是12个数,而我们的十进制数的容量就是10了,0-9共十个。而计算机为了精简系统并且提高效率,只设计了加法,并未设计减法,所以模在此时就显得很重要了。
  试想一下时钟的走位,假如此时是分针指向了6,当我想将其调整到3时要怎么操作(这里我们忽略时针的影响),有如下两种方法:
1.逆时针调整3格
2.顺时针调整9格
  假设我们定义顺时针为加法,逆时针为减法,那么以上两种方法是不是就是如下等式:6-3=6+9,也就是说减去一个数能够通过加上一个数来代替最后的变化值,这就是模在计算机中的一个重要作用。
  那么这个加上的数是如何获得的,加上的数 = 模-减去的数 ,即6 - 3 = 6 + (12 - 3)或 6 - 3 = 6 + (-3 + 12)。我们称这个加上的数为减去的数的补数。
  由以上我们总结出一个重要结论:减去一个数 = 加上这个数的补数。
  在计算机中我们定义了它的字长,当一个操作数超过了定义的字长将会产生溢出,此时将会形成如同时钟指针的循环,比如一个8位字长的计数器,它的最大值为1111 1111,当该值+1时,将会变为0000 0000,它的最高位1将被舍弃。
  

补码

  知道了模的概念和字长的概念,和计算机只能计算加法的设计我们知道为什么要引入补码:为了更好地贴合计算机设计,将减法转换为加法进行计算。下面举个例子
  计算机要计算8-3,在二进制中是如下进行操作的(假如为8位字长计算机):

  1. 8-3 = 8+(-3)
  2. 我们知道二进制8:0000 1000 ,那么二进制的-3是如何获得的,由上述模的描述我们知道-3的补数:
    10000 0000
    -0000 0011
    ------
    1111 1101
  3. 所以8+(-3):
    0000 1000
    +1111 1101
    ------
    10000 0101
    由于字长限制,首位1将被去掉,从而获得0000 0101 ,也就是十进制的5。

补码计算的推导

那我们知道计算机中是没有减法计算的,而且当超出计算机字长的模出现无法进行操作,那以上的步骤二在计算机中是如何实现的呢,其实就是补码的书面定义:原码的反码+1即为补码。该定义可以如此推导:
1000…00 - x…x(x为0或1) =
111..11 + 000…1 - x…x = 111..11 - x…x + 000…1=
x¯¯¯ x ¯ x¯¯¯ x ¯ + 000…1 = 反码 + 1

以上,有何不足或建议望指出。

参考内容:
维基百科
计算机组成原理

你可能感兴趣的:(计算机原理)