mirror of
https://github.com/ClovertaTheTrilobita/SanYeCao-blog.git
synced 2026-10-25 21:43:53 +00:00
Finish content
This commit is contained in:
parent
984a2789cf
commit
be7ff22ed7
1 changed files with 101 additions and 2 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: "如何教会计算机算术??加减篇"
|
title: "如何教会计算机算术??加减篇"
|
||||||
pubDate: 2026-08-04
|
pubDate: 2026-09-18
|
||||||
description: '欢迎来到琪露诺的奇妙数学教室,让我们从……加减法开始吧!'
|
description: '欢迎来到琪露诺的奇妙数学教室,让我们从……加减法开始吧!'
|
||||||
author: "三叶"
|
author: "三叶"
|
||||||
image:
|
image:
|
||||||
|
|
@ -203,7 +203,7 @@ $$
|
||||||
|
|
||||||
例如在一个8位操作系统中,你使用
|
例如在一个8位操作系统中,你使用
|
||||||
|
|
||||||
```C
|
```c
|
||||||
unsigned int i = 129;
|
unsigned int i = 129;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -290,3 +290,102 @@ $$
|
||||||
加法器的符号就可以表示为:
|
加法器的符号就可以表示为:
|
||||||
|
|
||||||
<img src="https://files.seeusercontent.com/2026/09/17/tE8g/_20260918000903_15_363.webp" alt="一位全加器.png" title="一位全加器" style="display: block; margin: 0px auto; zoom: 18%;">
|
<img src="https://files.seeusercontent.com/2026/09/17/tE8g/_20260918000903_15_363.webp" alt="一位全加器.png" title="一位全加器" style="display: block; margin: 0px auto; zoom: 18%;">
|
||||||
|
|
||||||
|
#### 溢出的判别方法
|
||||||
|
|
||||||
|
我们知道,补码的加减法运算仅在**同号相加**或**异号相减**的情况下可能溢出。这在直观上很好理解,因为两个同号数相减时,结果的绝对值肯定会小于减数或被减数的绝对值。
|
||||||
|
|
||||||
|
在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$的<b>反相</b>。如果$Y=1010$,则$\overline{Y}=0101$。
|
||||||
|
|
||||||
|
<img src="https://files.seeusercontent.com/2026/09/18/mTy9/drawio.png" alt="一位全加器.png" title="一位全加器" style="display: block; margin: 0px auto; zoom: 67%;">
|
||||||
|
|
||||||
|
### 2. 运算电路
|
||||||
|
|
||||||
|
我们把MUX接到加法器的一端,就有了如下电路:
|
||||||
|
|
||||||
|
<img src="https://files.seeusercontent.com/2026/09/18/Yw6j/drawio.png" alt="一位全加器.png" title="一位全加器" style="display: block; margin: 0px auto; zoom: 67%;">
|
||||||
|
|
||||||
|
在计算机中,有符号数和无符号数的加减运算,均采用这样的同一套电路实现。它的输入端包括连个$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添加到订阅里。
|
||||||
|
|
||||||
|
<img src="https://files.seeusercontent.com/2026/09/18/H6qn/100px-THBWiki-LOGO.gif" alt="一位全加器.png" title="一位全加器" style="display: block; margin: 0px auto; zoom: 67%;">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue