diff --git a/src/blog/zh/arithmetic-in-computer.md b/src/blog/zh/arithmetic-in-computer.md index 15aeb59..e65a1b6 100644 --- a/src/blog/zh/arithmetic-in-computer.md +++ b/src/blog/zh/arithmetic-in-computer.md @@ -221,4 +221,49 @@ unsigned int i = 129; 我们回忆一下手写运算。 -当我们计算$1011101+0101100$ \ No newline at end of file +当我们计算$1011101+0101100$时,用竖式来计算就是 +$$ +\begin{array}{r} + 1011101 \\ ++\,0101100 \\ +\hline + 10001001 +\end{array} +$$ +也就是,对每一位数单独进行加法运算,如果加和结果≧2,则向高位进1。 + +同样地,计算机进行加法运算也是这种思路。我们先试想一个最简单的加法电路:**一位全加器**。 + +在进行一个单位的加法时,我们需要处理**三个输入**:加数$A_i$、加数$B_i$、来自低位的进位$C_{i-1}$。它也会产生**两个输出**:加和结果的本位$S_i$和想高位的进位$C_i$。 + +我们先来分析一下如何计算$S_i$: + +- 当$A_i$与$B_i$相同,它们俩的加和结果的本位肯定是`0`。毕竟$0+0=0$,$1+1=10$。 +- $A_i$与$B_i$不同是,它们的加和结果肯定是`1`。 + +根据这一思路,计算二进制$A_i+B_i$可以用逻辑电路XOR表示,即$A_i \oplus B_i$。 + +现在我们把进位$C_i$用同样的思路放进这个加法式中:若$(A_i \oplus B_i)$和$C_i$相同则为`0`,$(A_i \oplus B_i)$和$C_i$不同则为`1`。即计算可以用$(A_i \oplus B_i) \oplus C_i$来表示,那么就有: +$$ +S_i = A_i \oplus B_i \oplus C_i +$$ +我们接下来看进位$C_i$: + +- 当$A_i$和$B_i$均为`1`,则产生进位。毕竟$1+1=10$。 +- 当$A_i$和$B_i$只有一个为`1`时: + - 若上一位运算的进位$C_{i-1}$是`1`,则产生进位。 + - 如果$C_{i-1}$是`0`,那$1+0=1$肯定不产生进位。 + +从结果上来讲,就是:$A_i$为`1`**且**$B_i$为`1`,**或**,$A_i$和$B_i$**相异** **且** $C_i$为`1`。 + +整理成逻辑表达式就是: +$$ +C_i=A_iB_i+(A_i \oplus B)C_{i-1} +$$ +那么一位全加器的逻辑结构就如下图所示。 + +一位全加器.png + +我们把它封装起来,仅对外保留输入输出,那它的逻辑符号表示为: + +一位全加器.png \ No newline at end of file