两个二进制补码相加运算二进制

我们都知道在计算机中的加减運算都是由两个二进制补码相加来实现的,那么计算机是如何运用电路来实现两个二进制补码相加的加减的呢?在计算机中所有的加減运算其实都变成了加法后来参与运算的,那么仅需要一个加法器就可以实现了请看下面内容。

全加器英语名称为full-adder是用门电路实现两個二进制数相加并求出和的组合线路,称为一位全加器一位全加器可以处理低位进位,并输出本位加法进位多个一位全加器进行级联鈳以得到多位全加器。

(1)一位全加器逻辑电路图如下

该一位全加器的求和部分Si由两个异或门组成,进位部分Ci+1由与非门组成

全加器由两个②进制数字Ai,Bi和一个进位输入Ci相加,产生一个和输出Si,以及一个进位输出Ci+1。

下表中列出一位全加器进行加法运算的输入输出真值表

根据所示嘚真值表,三个输入端和两个输入端可按如下逻辑方程进行联系:

看到这里你想起了什么?是不是两个二进制补码相加运算的相加、进位、判断溢出


(1)对于定点数的加法

(2)对于定点数的减法

可以看出,在两个二进制补码相加运算中减法都变成了了加上该两个二进制补碼相加负数的形式。

即[X]补包括符号位在内的各位取反末位加一后变成[-X]补

那么如何使用电路实现?如下

2.多位全加器实现两个二进制补码相加加减运算

(1)图中字母代表含义

方向控制 (即控制做加\减法运算)

当时加法运算时我们的控制输入M就会起到相应的作用,当M=0时他与Bn楿连,做异或处理此时可见结果就等于Bn本身,此时Bn输入到一位的全加器中与An输入相加,在n=0处还加上了M的0对结果无影响。

而当M=1时进荇减法运算,此时的Bn与M=1进行异或得到的就是Bn的反码,而最低位的M=1做一个加数进入到运算中就是:An+(Bn+1)此时的1在最低位。那么就可以看到其实这时的M作用一就是将[Y]补转换成[-Y]补,使整个电路做两个二进制补码相加的减法运算


而在这里,就是采用的单符号位法来判断是否溢出

1.當最高数值位产生进位而符号位不产生进位时产生上溢;
2. 当最高数值位不产生进位而符号位产生进位时,产生下溢

总:只要最高数值位与符号位 “都产生进位或都不产生进位(同号)” 时不溢出,否则溢出

那么我们从电路图中就可以看出:

1.若Cn与Cn-1同号,则经过异或门结果为0不溢出;
1.若Cn与Cn-1异号,则经过异或门结果为1溢出;

Cn我们在前面说过,就是输出的进位

}

负数在计算机中如何表示

举例來说,+8在计算机中表示为二进制的1000那么-8怎么表示呢?

很容易想到可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数等于1时就表示负数。比如在8位机中,规定每个字节的最高位为符号位那么,+8就是而-8则是。

但是随便找一本《计算机原理》,都会告诉你实际上,计算机内部采用2的两个二进制补码相加(Two's Complement)表示负数

它是一种数值的转换方法,要分二步完成:

第一步每一个二进淛位都取相反值,0变成11变成0。比如的相反值就是。

第二步将上一步得到的值加1。就变成

所以,的2的两个二进制补码相加就是也僦是说,-8在计算机(8位机)中就是用表示

不知道你怎么看,反正我觉得很奇怪为什么要采用这么麻烦的方式表示负数,更直觉的方式難道不好吗

昨天,我在一本书里又看到了这个问题然后就花了一点时间到网上找资料,现在总算彻底搞明白了

首先,要明确一点計算机内部用什么方式表示负数,其实是无所谓的只要能够保持一一对应的关系,就可以用任意方式表示负数所以,既然可以任意选擇那么理应选择一种最方便的方式。

2的两个二进制补码相加就是最方便的方式它的便利体现在,所有的加法运算可以使用同一种电路唍成

假定有两种表示方法。一种是直觉表示法即;另一种是2的两个二进制补码相加表示法,即请问哪一种表示法在加法运算中更方便?

16的二进制表示是 所以用直觉表示法,加法就要写成:

可以看到如果按照正常的加法规则,就会得到的结果转成十进制就是-24。显嘫这是错误的答案。也就是说在这种情况下,正常的加法规则不适用于正数与负数的加法因此必须制定两套运算规则,一套用于正數加正数还有一套用于正数加负数。从电路上说就是必须为加法运算做两种电路。

现在再来看2的两个二进制补码相加表示法。

可以看到按照正常的加法规则,得到的结果是注意,这是一个9位的二进制数我们已经假定这是一台8位机,因此最高的第9位是一个溢出位会被自动舍去。所以结果就变成了,转成十进制正好是8也就是16 + (-8) 的正确答案。这说明了2的两个二进制补码相加表示法可以将加法运算规则,扩展到整个整数集从而用一套电路就可以实现全部整数的加法。

在回答2的两个二进制补码相加为什么能正确实现加法运算之前我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的

要将正数转成对应的负数,其实只要用0减去这个数就可以了比如,-8其实就是0-8

已知8的二进制是,-8就可以用下面的式子求出:

因为(被减数)小于0000100(减数)所以不够减。请回忆一下小学算术如果被减数嘚某一位小于减数,我们怎么办很简单,问上一位借1就可以了

所以,0000000也问上一位借了1也就是说,被减数其实是算式也就改写成:

進一步观察,可以发现 = + 1所以上面的式子可以拆成两个:

2的两个二进制补码相加的两个转换步骤就是这么来的。

为什么正数加法适用于2的兩个二进制补码相加

实际上,我们要证明的是X-Y或X+(-Y)可以用X加上Y的2的两个二进制补码相加完成。

Y的2的两个二进制补码相加等于(-Y)+1所以,X加仩Y的2的两个二进制补码相加就等于:

接下来,分成两种情况讨论

第一种情况,如果X小于Y那么Z是一个负数。这时我们就对Z采用2的两個二进制补码相加的逆运算,求出它对应的正数绝对值再在前面加上负号就行了。所以

第二种情况,如果X大于Y这意味着Z肯定大于,泹是我们规定了这是8位机最高的第9位是溢出位,必须被舍去这相当于减去。所以

这就证明了,在正常的加法规则下可以利用2的两個二进制补码相加得到正数与负数相加的正确结果。换言之计算机只要部署加法电路和两个二进制补码相加电路,就可以完成所有整数嘚加法

}

正数 原码 反码 相同 只考虑进位
负數 反码是符号位不变 取反码+1
结合计算机存储原理你会发现你的问题是个公理

}

我要回帖

更多关于 两个二进制补码相加 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信