From be7ff22ed74cb5cc080d22ab2b0119e511032315 Mon Sep 17 00:00:00 2001 From: ClovertaTheTrilobita Date: Fri, 18 Sep 2026 14:42:39 +0800 Subject: [PATCH] Finish content --- src/blog/zh/arithmetic-in-computer.md | 103 +++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/src/blog/zh/arithmetic-in-computer.md b/src/blog/zh/arithmetic-in-computer.md index fb9dd34..6560429 100644 --- a/src/blog/zh/arithmetic-in-computer.md +++ b/src/blog/zh/arithmetic-in-computer.md @@ -1,6 +1,6 @@ --- title: "如何教会计算机算术??加减篇" -pubDate: 2026-08-04 +pubDate: 2026-09-18 description: '欢迎来到琪露诺的奇妙数学教室,让我们从……加减法开始吧!' author: "三叶" image: @@ -203,7 +203,7 @@ $$ 例如在一个8位操作系统中,你使用 -```C +```c unsigned int i = 129; ``` @@ -290,3 +290,102 @@ $$ 加法器的符号就可以表示为: 一位全加器.png + +#### 溢出的判别方法 + +我们知道,补码的加减法运算仅在**同号相加**或**异号相减**的情况下可能溢出。这在直观上很好理解,因为两个同号数相减时,结果的绝对值肯定会小于减数或被减数的绝对值。 + +在8bit机器中,当运算结果超出127时,它会回到-128。例如$127+3=-126$。我们依此可以设计出一个非常直观的判断方法:**当两个数的符号相同时,若计算结果的符号和它们不同,则发生了溢出**。 + +##### 1)**采用一位符号位** + +设参与运算的两个数的符号位分别为$A_i$和$B_i$,运算结果的符号位是$S_i$,可得溢出逻辑表达式: +$$ +V=A_iB_i\overline{S_i}+\overline{A_iB_i}S_i +$$ + +##### 2)采用**一位符号位**并结合**进位** + +- 如果两个数是正数,那它的符号位都是`0`,肯定不会向后进位。 + - 此时如果次高位未向它进位,说明符号没有改变,符号位仍然是`0`。 + - 此时次高位向它进了一位,那符号位就变成`1`了,符号改变,发生溢出。 +- 两数为负数时同理,它们符号位都是`1`,必会向后进一位,且相加后本位是`0`。 + - 如果次高位向它进`1`,则符号位还是`1`,未溢出。 + - 若次高位未向它进位,则符号位`0`,符号改变,发生溢出。 + +总结一下,**如果最高位和次高位发生的进位不同,则溢出**。 + +换言之,假设计算后符号位产生的进位是$C_n$,次高位(数值的最高位)产生的进位是$C_{n-1}$,若$C_n$与$C_{n-1}$不同,则表示溢出。 +$$ +V=S_{i} \oplus S_{i-1} +$$ + +> 你也可以这样理解: +> +> 我们知道,在计算机做负数运算时,其实是将该数的补码相加。 +> +> 那么如果两个数的补码加和结果未溢出,说明原码加和溢出了。 + +## 三、加减运算电路 + +Finally! 大的要来了!但是在这之前我们要了解一个小插曲。 + +### 1. MUX多路选择器 + +在加减法电路中,我们需要一个**二选一多路选择器MUX**,用它来控制进行加法还是减法。 + +思路很简单,如果是减法,则给被减数取相反数。也就是 +$$ +X-Y \rightarrow X+(-Y) +$$ +我们同时给MUX输入$Y$和$\overline{Y}$,并给其一个信号Sub + +- 如果Sub为`0`,则说明进行加法,MUX选择$Y$输出 +- 如果Sub是`1`,进行减法,MUX选择$\overline{Y}$输出 + +> $\overline{Y}$是$Y$的反相。如果$Y=1010$,则$\overline{Y}=0101$。 + +一位全加器.png + +### 2. 运算电路 + +我们把MUX接到加法器的一端,就有了如下电路: + +一位全加器.png + +在计算机中,有符号数和无符号数的加减运算,均采用这样的同一套电路实现。它的输入端包括连个$n$位操作数$X$和$Y$,还有一个控制信号$Sub$。 + +控制信号$Sub$不仅决定选择哪一路数据进入加法器,在执行减法时($Sub$为`1`)作为最低位的进位输入。 + +现在大功告成了,我们来一步一步解析加减法运算时的工作原理。 + +#### 加法运算 + +- $X$直接被输入到加法器中 +- $Sub$为`0`,所以MUX选择$Y$输入到加法器中 +- 加法器直接运算$X+Y+C_{in}$,并输出$n$位结果$F$和进位输出$C_{out}$,并生成状态标志位 + +值得注意的是,如果$X$和$Y$是无符号数,那么结果$F=(X+Y)\mod2^n$,如果$X+Y\ge2^n$,就会产生进位$C_{out}=1$,就表示发生无符号溢出。 + +#### 减法运算 + +- $X$直接被输入到加法器中 +- $Sub$为`1`,所以MUX选择$\overline{Y}$输入到加法器 +- 加法器运算$X+\overline{Y}+C_{in}$,也就是$X+\overline{Y}+1$ + +如果此时我们在计算有符号数的减法,那么$[Y]_补$取反再+1刚好就是$[-Y]_补$,所做的运算就等同于$X+(-Y)$。 + +另外,如果计算的是无符号数减法,我们规定**溢出标志OF是$C_{out}$取反**。即$OF=\overline{C_{out}}$。这一点和无符号数加法正好相反。 + +因为运算等价于$X-Y+2^n$,那么 + +- $X\ge Y$时,$X-Y+2^n \ge 2^n$,有进位。 +- $X\le Y$时,$X-Y+2^n \le 2^n$,无进位$C_{out}=0$,此时$OF=\overline{C_{out}}=1$,表示溢出。 + +## 尾声 + +老妈推门而入,怒目圆瞪地盯着你的电脑屏幕,但此时你打开的是[三叶的博客](https://blog.cloverta.top)! + +原来你在学习二进制加减法,她满意地点点头,这个人博客写的还可以的,你记得把他的RSS添加到订阅里。 + +一位全加器.png