从零开始学编码7

      从零开始学编码6中我们学习了怎么一步步使用基本逻辑门构建出来一个8位二进制加法器,而这篇文章我们要通过加法器来实现减法运算,并且引出反码和补码的概念。

      小学的时候,我们学过各种算术技巧,口算,心算,指算,凑十法,找朋友等,有各种各样的口诀。而其中有一个技巧是算减法时所用,例如:253-176这里需要使用借位,但是如果使用:

            253-176+999+1-1000=253+(999-176)+1-1000=77

       通过上面的转换,我们不使用借位也能计算出差。这种从一串9中减去一个数叫做对9求补数。这种计算方式的好处是无论减数是多少,计算对9的补数都不需要借位。

         这种技巧同样可以用在二进制中,并且更加简单,当然在二进制中需要减数从一串1中减去,结果称为1的补数。

        这时253-176可以转化为:11111101-10110000,然后使用求1补数的技巧,用11111111-10110000=01001111,这是我们观察减数和结果,可以发现,只需将二进制减数中的1变成0,0变成1即可。所以对1求补数也被称为相反数或者反码

        我们将减数的反码和被减数相加,然后结果加1,最后再减去100000000,结果就是1001101,即十进制的77。

        11111101+01001111=101001100

        101001100+1 = 101001101

        101001101-100000000=1001101

        通过上面的分析我们知道,使用加法来计算减法,主要用到的技巧是反码,而反码的特性是将1变成0,将0变成1,这和我们前面说过的反相器的表现是一致的。那么我们是不是可以使用上篇文章所抽象出来的8位加法器和一些反向器设计出来一个8位减法器呢?答案是肯定的。

       设计思路就是在加法器中新增一个用来求8位二进制数对1补数的电路,也就是说求8位二进制数反码的电路,我们可以增加8个反向器。

从零开始学编码7
8个反向器用来对二进制数取反

       能够对输入取反了,我们提出更加严格的要求,要求不但能做加法还能做减法的机器,这就要求只有做减法时,反向器的输入才有效,加法时,反向器的输入无效。可以通过异或门的工作方式,将电路再次优化:

从零开始学编码7
可以通过取反信号控制的电路

       上图中,如果有疑惑,可以对照着前面文章中的异或门来分析这个电路。而将8个异或门合并起来组成一个器件,称为“求补器”,如下图所示:

从零开始学编码7
求补器

       通过将一个求补器,一个8位加法器和一个异或门连接成一个支持加减法的加法器:

从零开始学编码7
支持加减法的加法器

       图中的三个SUB信号,就是加/减法转换开关。

       当该信号为0时,其进行的是加法运算,最上面的SUB取值为0,B输入的信号通过求补器时不进行取反,中间的SUB因为是加法求补电路不起作用,CI为0即可,最下面的SUB为0时,对CO结果没有影响。

        当该信号为1时,其进行的是减法运算,最上面的SUB取值为1,B输入的信号通过求补器时进行取反,中间的SUB为计算结果加上1,最下面的SUB信号只有减数大于被减数表示负数的时候才有作用,而这个器件目前还不支持负数。

        上面讨论减法时,一直避免引入减数大于被减数的情况。如果这种情况下求出的结果是负数,而如何表示负数呢?

        有两种方式:一种是将最高位定为符号位,如果为1就表示负数,如果为0就表示正数。还有一种方法是用补数来表示。二进制如果是有符号的8位二进制表示范围是-128~127,如果是无符号的8位二进制所表示的范围是0~255。

         

     上一篇:从零开始学编码6(二进制加法器)