上次试着做了一个4位加法器,这次来做一个减法器。
要计算减法,那就会出现正负数,我们用0表示正数,1表示负数,并且最高位代表符号位。
例如 0001(+1) 1010(-2) 1100(-4) 以此类推,这样的表示叫做原码表示法。
补码
时钟举例
我们先用时钟来举例,例如现在是下午4点整,时钟的表盘上只有12个数,因此现在的时针指向了4。
若我们要把4点整调成0点(12点),那么有两种方法:
- 反向旋转时针 -4
- 正向旋转时针 +8
这两种方法都可以达到目的,这是不是和正负数加减类似?
4 – 4实际上就是 4 + (-4),所以计算二进制减法的时候,可以类比时钟:
将4变成0只需要+8即可(时钟可以看做是12进制),因此得到了4+8=10这个结果,这时只需要舍去进位,剩下的本位就是我们要的结果。
二进制补码
二进制也是如此:
我们要使0100(+4)变成0000,只需要先加一个数让它变成1111,再继续+0001溢出,最后的四位结果就是我们想要的。
观察一下,只需要原来是1的位置+0、原来是0的位置+1即可达到目的,因此0100+1011=1111。
你会发现加上的数刚好是原来的数取反(0变成1、1变成0),最后我们再+0001溢出即可。
像这样把一个数取反再加一,叫做补码表示法,例如1101(-3),这样的数可以直接作为加法运算的加数。
结论
按照上面的思路,我们可以得出负数的计算步骤:加数+负数取反+1 = 结果。
实际操作
按照上面的结论,可以设计出如下逻辑电路,中间的是4位全加器,下面默认是A – B。
可以看到,我们给第一个半加器的 输入进位 输入了常量1(加法交换律,先加一也没问题awa)。
下面来验证一下它是否真正有用,还是拿4-4举例,这里只需要都输入0100(+4),因为默认了A – B,B已经取反了。
右边输出的结果是[1]0000(+0),结果没有问题,再试试4-3行不行…也就是A:0100 B:0011
可以看到结果是[1]0001(+1),也没问题,如果是3 – 4呢?
3 – 4的结果是[0]1111(+15),因此减法器并不能得到负数结果…
总结
减法器并不能计算出负数,当被减数小于减数时就会出问题。要解决这个问题可以先判断两数大小,若A>B则取反B 得到的结果是正数,A<B则取反A 得到的结果是负数,这个问题日后再讨论吧……