二进制加法

首先,单个位的二进制相加结果如下表所示:

ABSUM
000
011
101
110

通过这个结果表,明显可以看出这是一个单个位的异或运算,所以说不考虑进位的情况下,二进制加法就是异或运算。

如果考虑进位的话,那么加法结果就不能用一个位来进行表示,因为需要同时表示结果和进位,如下表所示:

ABSUMC
0000
0110
1010
1101

可以看出进位的结果就是作与运算

所以单个位的加法结果是就是同时作异或和与运算,逻辑电路图如下:

这是一个半加器,用来计算单个位相加的情况。

现在考虑下,多个位进行相加,需要将低位的进位作为高位的输入才行,这时候出现了全加器,如下图所示:

全加器具有三个输入,分别是加数,被加数和进位,结果有两位和以及进位。

如果多个位进行相加只需要将全加器层级串联起来即可,然后将和统计作为结果。

溢出

从上面的内容可以看出多位二进制相加就是多个全加器连接在一起,然后将每个全加器的结果S作为加法结果,会自动抛弃最高位相加的进位。

既然知道了二进制加法的实质,那么考虑下二进制加法溢出的情况,所谓溢出在逻辑运算的概念上就是由二进制最高位相加的进位来决定的,如果进位为1则表示会溢出,但是结果被抛弃掉了。

上面说的是二进制加法的溢出情况,转换到C语言w位无符号数来看,如果最高位相加之后进位为1的话,表示两个无符号数相加结果大于$2^{w}-1$表示溢出,然后加法器加法器将进位抛弃掉就相当于给结果减掉$2^{w}$,所以无符号数的加法如下所示:

$$ x+_{w}^{u} y=\begin {cases} x+y &,x+y<2^{w} 最高位进位为0 \\ x+y-2^{w} &, 2^{w} \leq x+y <2^{w=1} 最高位进位为1,但是被加法器抛弃掉 \end {cases} $$

补码加法和无符号数加法的位极操作一致,只是解释位十进制时,把最高位的权重作为$-2^{w-1}$

w位补码进行相加,如果第w-2位相加之后进位为1的话表示溢出。