diff --git a/src/blog/zh/arithmetic-in-computer.md b/src/blog/zh/arithmetic-in-computer.md index e65a1b6..fb9dd34 100644 --- a/src/blog/zh/arithmetic-in-computer.md +++ b/src/blog/zh/arithmetic-in-computer.md @@ -4,8 +4,8 @@ pubDate: 2026-08-04 description: '欢迎来到琪露诺的奇妙数学教室,让我们从……加减法开始吧!' author: "三叶" image: - url: "https://files.seeusercontent.com/2026/08/04/fkE6/pasted-image-1785836458506.webp" - alt: "bintree" + url: "https://files.seeusercontent.com/2026/09/17/Dn5p/_20260917235541_13_363.webp" + alt: "ciruno" tags: ["学习笔记", "计算机组成原理"] --- @@ -95,7 +95,7 @@ $$ 没错,**32位操作系统**代表着,对于`int`整形的变量,一共有32个**比特**用来存储这么一个数。 -也就是说,二进制数的长度最长可以有32位。 +也就是说,整形二进制数的长度最长可以有32位。 好多!那么程序员在调试的时候总不能用手指头指着屏幕上的0和1一个一个数过去吧? @@ -149,9 +149,7 @@ $$ $$ 130\bmod 128=2 $$ -没错,我们这样子计算,刚好就是在将计算结果对$128$进行[模运算](https://zh.wikipedia.org/zh-cn/%E6%A8%A1%E7%AE%97%E6%95%B8)! - -那我们是不是可以巧妙地利用这一特性,通过加法来实现减法呢?! +没错,我们这样子计算,刚好就是在将计算结果对$128$进行[模运算](https://zh.wikipedia.org/zh-cn/%E6%A8%A1%E7%AE%97%E6%95%B8)。那我们是不是可以巧妙地利用这一特性,通过加法来实现减法呢? 比如说我们有两个数:$50$和$30$,我们需要计算$50-30$ @@ -213,7 +211,7 @@ unsigned int i = 129; ## 二、加减法的运算电路 -在计算机中,传统的**运算器**由**算术逻辑单元ALU**、**移位器**、**状态寄存器PSW**和**通用寄存器组**等组成。 +在计算机中,**传统**的**运算器**由**算术逻辑单元ALU**、**移位器**、**状态寄存器PSW**和**通用寄存器组**等组成。 但是我们先别管那么多,首先我们来看ALU。ALU的核心部件是**加法器**。 @@ -266,4 +264,29 @@ $$ 我们把它封装起来,仅对外保留输入输出,那它的逻辑符号表示为: -一位全加器.png \ No newline at end of file +一位全加器.png + +### 2. 串行进位加法器 + +将$n$个全加器级联就可以构成$n$位串行进位加法器(又称行波进位加法器),如下图所示 + +一位全加器.png + +将它们这样子串在一起,就可以轻松实现两个二进制数的加法。 + +我们把它封装成一个整体,就得到了传统的**加法器**。 + +### 3. 带标志加法器 + +对于$n$位加法器来说,除了得到运算结果外,我们经常需要知道计算过程中是否发生了溢出、结果正负性、结果是否为零等等信息。 + +我们要求加法器能生成以下标志位: + +- $OF$:**溢出标志**,为`1`表示溢出,`0`表示未溢出。$OF=C_n \oplus C_{n-1}$ +- $SF$:**符号标志**,等于结果的最高有效位,`1`表示负,`0`表示正。$SF=S_i$ +- $ZF$:**零标志**,`1`表示加减运算的结果为$0$。在所有位均为`0`时设置为`1`。 +- $CF$:进位/借位标志,用于判断无符号数的加减运算是否发生溢出。`1`表示溢出,`0`表示未溢出。 + +加法器的符号就可以表示为: + +一位全加器.png