# 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）：检测输出是否为负数。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cccs.viyi.cc/1-ji-suan-ji-zu-cheng/1.5-alu-suan-shu-luo-ji-dan-yuan-how-computers-calculate.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
