> For the complete documentation index, see [llms.txt](https://cccs.viyi.cc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cccs.viyi.cc/1-ji-suan-ji-zu-cheng/1.5-alu-suan-shu-luo-ji-dan-yuan-how-computers-calculate.md).

# 1.5 ALU 算术逻辑单元 （How Computers Calculate）

ALU 算术逻辑单元（Arithmetic and Logic Unit）是计算机中负责运算的组件。

最著名的 ALU 之一是 Intel 74181，其于 1970 年发布，是第一个封装在单个芯片中的完整 ALU。 Intel 74181 使用了 70 个逻辑门，但无法执行乘除运算。

<figure><img src="/files/w8q1BdHokAKbu9zeul78" alt=""><figcaption><p>Intel 74181</p></figcaption></figure>

ALU 由 1 个算术单元（arithmetic）和 1 个逻辑单元（logic unit）组成，算术单元可用于进行加减法运算或是增量运算（x+1），逻辑单元执行逻辑操作（如布尔代数中的基本运算）。

## 1.5.1 算术单元

### 半加器

半加器（half adder）由异或门和与门组成，仅能计算 1 位加法。两个输入（0 或 1）有 4 种可能的输出（1 = true，0 = false），不计进位的情况（1+1=0，高位舍弃）可用「异或门」搭建：

<figure><img src="/files/jpwfvthTLdPfaz9vsCmY" alt=""><figcaption></figcaption></figure>

当且仅当两个输入均为 1 时需要进位，该规则和「与门」相同，两者连接则为半加器：

<figure><img src="/files/v27CkV79ZycIb2uzKdLu" alt=""><figcaption><p>半加器</p></figcaption></figure>

### 全加器

使用半加器做两个三位二进制数加法时，需要多加一个进位上的数字（共计 3 个数相加）。

<figure><img src="/files/L2CxOILCg7lGQlfCNTT6" alt=""><figcaption></figcaption></figure>

全加器的真值表如下：

<figure><img src="/files/jQ6tf18FInccULNexJOx" alt=""><figcaption></figcaption></figure>

全加器的逻辑门电路如下：

<figure><img src="/files/PCtKSoDQsPiRjwSENM6M" alt=""><figcaption></figcaption></figure>

### 8 位行波进位加法器

全加器可以处理两个三位二进制数的加法运算，两个八位二进制数的加法可以从低位逐列相加，用 1 个半加器和 7 个全加器搭建：

<figure><img src="/files/5xqvERSrb9cLvx0amVyH" alt=""><figcaption><p>八位行波进位加法器</p></figcaption></figure>

当计算结果的位数大于可用于表示的位数，则会出现「溢出」（overflow），这会导致 error 和不可预期的结果。

为防止溢出，可以使用更多的全加器来完成 16 位或是 32 位数字的操作。但使用更多的逻辑门会提高造价，同时进位计算的耗时也更多，在每秒几十亿次的运算下该延迟仍然会造成影响。所以现代计算机所采用的加法电路为「超前进位加法器」（carry-look-ahead），其速度更快。

### 乘除法

ALU 的算术单元基本都支持下图中的 8 种操作，简单 ALU 可以通过累加/累减来实现四则运算中的乘除法（慢但有效），复杂 ALU 会用更多的逻辑门构建乘法电路。

<figure><img src="/files/5RGLZEdstjXdGMF4hg5d" alt=""><figcaption><p>ALU 算术单元支持的八种操作</p></figcaption></figure>

## 1.5.2 逻辑单元

逻辑单元（logic unit）用于执行逻辑操作，比 AND、OR 和 NOT 操作，也可以用于进行简单的数值测试。注意此处的 0 和 1 遵守布尔代数的逻辑运作，而非算术加减。

下图的逻辑单元门电路用于检测输出是否为 0（可用于确认两数字是否相等），OR 或门遇 1 出 1，最后用 NOT 非门取反后，凡有 1 则为 0，检测结果为 False 假，意为输出不为 0（其中至少有一位是 1）。

<figure><img src="/files/GZuQhOJeWKyqEcMZRa0J" alt=""><figcaption><p>检测输出是否为 0 的逻辑单元电路</p></figcaption></figure>

## 1.5.3 ALU 抽象

8 位 ALU 需要用上百个逻辑门搭建，因此工程师用镂空大 V 符号来表示 ALU 组件：

<figure><img src="/files/8cShmqTdfdMEAJKXjq6f" alt="" width="193"><figcaption><p>ALU</p></figcaption></figure>

简图如下：

<figure><img src="/files/c02K9fAgWA7tAZesQfZP" alt=""><figcaption><p>8 位 ALU 基本图形</p></figcaption></figure>

除了两个 8 位的输出和一个输入之外，8 位 ALU 还需要用 4-bits「操作码」（Operation Code）确认执行操作类型，同时还会输出一些 1-bit 的标志位（Flags）表示特定状态，常见类型如下：

* 溢出位（Overflow）检测是否发生溢出情况。
* 零标志位（Zero）：检测输出是否为零。
* 负标志位（Negative）：检测输出是否为负数。
