编码:隐藏在计算机软硬件背后的语言(四)减法实现

Code:The Hidden Language of Computer Hardware and Software

四、减法实现

1、减法实现原理及相关概念

减法器的实现依赖加法器,当两个操作数进行减法运算时;如A-B=A+(-B)即可以将B的数进行取反与A相加,从而实现减法运算。
相关概念:补数如253的补数就是999-253=746,746称253对9的补数;若二进制则称对1的补数。

2、减法的两种情况

1)被减数-减数>0
    例如:十进制数:253-176=(999-176)+253+1-1000  
               二进制数:253-176=1111 1101-1011 0000              
    第一步:求出176对9的补数C,也称反码或相反数; 
                  1111 1111 - 1011 0000 =   0100 1111
    第二步:求补数C加上被减数253结果为S1;
                   0100 1111 + 1111 1101 =1 0100 1100
    第三步:求S1加上1结果为S2; 
                   1 0100 1100+ 0000 0001=1 0100 1101
    第四步:S2减去1000为最终结果77。
                   1 0100 1101-10000 0000=   0100 1101=77     
上述过程,避免了借位。  
               
2)被减数-减数<0
    例如:十进制数:176-253=-(999-((999-253)+176))
               二进制数:176-253=1011 0000-1111 1101
    第一步:求出253对9的补数C;
                   1111 1111-1111 1101=0000 0010
    第二步:求补数C加上被减数176结果为S1;
                   1011 0000+0000 0010=1011 0010
    第三步:求999减去S1结果为S2;
                   1111 1111 - 1011 0010 =0100 1101 =77
    第四步:S2取反得到结果。
总结一下就是“减数求补,与被减速求和,结果加1,最高位减1”。

3.减法器电路设计

简便起见,下文减法机只执行被减数大于减数的减法操作, 减法机面板如下:
如图所示,Sub与Add开关是进行加减法按钮,Overflow与Underflow是溢出位,表明结果大于255或出现负数时显示。
减法器就是加法的逆运算如A-B=A+(-B),由表达式可以看出,我们需要将减数进行取反再与被减数进行加法器运算。
8位取反使用8个反向器即可,但考虑Sub与Add开关控制加减运算,需要在加法运算时,减数不需要取反。逻辑如下:
当Add=0时处于加法器,不需要取反;Sub=1时处于减法,对应的操作数需要取反。异或门满足逻辑,电路如下:
封装器件如下:
减法器整体电路如下:
注几点说明
a.对于Sub=1时,进行减法运算如253-176
  • 253-176+1000-1000

  • 253-176+999+1-1000

  • 253+(999-176)+1-1000

需要将减数176取反,
再与被减数253相加,
CI相当于上式加1,
那最高位如何减1,当Sub=1,CO与Sub异或结果,相当于最高位减去1.
b.Sub=0时,进行加法运算:
加法时CI=0,
最高位无需变化。

看起来我们已经做出了一个减法器,虽然它能解决一部分减法运算,但是对于负数它还是无能为力,所以接下来就有必要了解一下二进制中负数的表示。

4.负数的表示

1)对于符号数,机器数常用的表示方法有原码、反码、补码。数X的 原码记[X]原,反码记[X]反,补码记[X]补。注意:对正数,三种表示方法均相同。他们的差别在于对负数的表示。
原码:符号位:0表示正,1表示负;
数值位:真值的绝对值;
数0的原码不唯一。
原码对正数的加法可以正常运算,对于减法就不适用,故引入反码。
例如:1-1=1+(-1)=[0000 0001]原+[1000 0001]原=-1
反码:X>0,[X]原=[X]反;X<0,[X]反=对应原码的符号位不变,数值位按位取反;注意:数0的反码也不唯一。
反码的引入解决减法问题。
例如:1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]反+[1111 1110]反=[1111 1111]反=[1000 0000]原=-0;反码解决减法结果,但未解决+0与-0问题,故引入补码机制,
补码:X>0,[X]补=[X]原=[X]反;X<0,[X]补=[X]反+1;计算机中有符号数都是以补码形式存储。
+0=0000 0000 
-0=[1000 0000]原=[1111 1111]反 =[1111 1111]反 +1 = 1 [0000 0000]补
故+0=-0。
八位二进制表示范围:
原码:-127~+127
反码:-127~+127
补码:-128~+127
二进制中对应的系统称为2的补数。假设我们用8位二进制数工作,范围从00000000~11111111,对应于十进制的0~255。这时如果你想要表达负数,则以1开头的每个8位数都表示一个负数,如下所示:相反数就是所有位取反再加1

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值