Files
obsidian/计算机组成原理/学习笔记/06_运算方法.md

477 lines
10 KiB
Markdown
Raw Normal View History

2026-07-04 12:12:55 +08:00
# 第6章 运算方法
> 📖 本章介绍计算机中数据的表示方法和算术运算,是课程的重点和难点。
> 🎯 重点理解补码运算和浮点数表示
---
## 📋 本章目录
- [[#6.1 无符号数和有符号数]]
- [[#6.2 定点数]]
- [[#6.3 浮点数]]
- [[#6.4 定点运算]]
- [[#6.5 浮点运算]]
- [[#本章小结]]
---
## 6.1 无符号数和有符号数
### 6.1.1 无符号数
> [!info] 定义
> 没有符号的数,所有位都表示数值。
**表示范围**n位
$$0 \sim 2^n - 1$$
> [!example] 示例
> 16位无符号数0 ~ 65535
### 6.1.2 有符号数
#### 机器数与真值
| 概念 | 定义 | 示例 |
|------|------|------|
| **真值** | 带正负号的数 | +1100, -1100 |
| **机器数** | 符号数字化的数 | 0,1100, 1,1100 |
**符号编码**
- 0 表示正数
- 1 表示负数
#### 1. 原码表示法
> [!info] 定义
> 符号位 + 数值的绝对值
**整数原码**
$$[x]_{原} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^n - x & 0 \geq x > -2^n \end{cases}$$
**小数原码**
$$[x]_{原} = \begin{cases} x & 1 > x \geq 0 \\ 1 - x & 0 \geq x > -1 \end{cases}$$
> [!example] 示例
> - x = +1110 → [x]原 = 0,1110
> - x = -1110 → [x]原 = 1,1110
> - x = +0.1101 → [x]原 = 0.1101
> - x = -0.1101 → [x]原 = 1.1101
**零的表示**
- [+0]原 = 0.0000
- [-0]原 = 1.0000
**特点**
- 表示简单,易于转换
- 加减运算复杂
- 零有两种表示
#### 2. 补码表示法
> [!important] 核心思想
> 用正数代替负数,将减法转换为加法。
**补数的概念**(时钟例子):
- 时钟模为12
- -3 ≡ +9 (mod 12)
- 9 - 5 = 9 + 7 = 16 ≡ 4 (mod 12)
**整数补码**
$$[x]_{补} = \begin{cases} 0,x & 2^n > x \geq 0 \\ 2^{n+1} + x & 0 > x \geq -2^n \end{cases}$$
**小数补码**
$$[x]_{补} = \begin{cases} x & 1 > x \geq 0 \\ 2 + x & 0 > x \geq -1 \end{cases}$$
> [!example] 示例
> - x = +1010 → [x]补 = 0,1010
> - x = -1010 → [x]补 = 2^5 + (-1010) = 100000 - 1010 = 1,0110
> - x = +0.1001 → [x]补 = 0.1001
> - x = -0.1001 → [x]补 = 2 + (-0.1001) = 1.0111
**零的表示**
- [+0]补 = [-0]补 = 0.0000(唯一表示)
**补码范围**n位整数
$$-2^n \sim +(2^n - 1)$$
> [!warning] 特殊值
> 8位补码-128的补码为10000000没有对应的原码
#### 3. 反码表示法
**整数反码**
$$[x]_{反} = \begin{cases} 0,x & 2^n > x \geq 0 \\ (2^{n+1}-1) + x & 0 \geq x > -2^n \end{cases}$$
**小数反码**
$$[x]_{反} = \begin{cases} x & 1 > x \geq 0 \\ (2-2^{-n}) + x & 0 \geq x > -1 \end{cases}$$
> [!example] 示例
> - x = +1101 → [x]反 = 0,1101
> - x = -1101 → [x]反 = 1,0010
**零的表示**
- [+0]反 = 0.0000
- [-0]反 = 1.1111
#### 4. 移码表示法
> [!info] 定义
> 移码 = 补码符号位取反
**用途**:便于比较大小(移码大的真值大)
**整数移码**
$$[x]_{移} = 2^n + x \quad (-2^n \leq x < 2^n)$$
> [!example] 示例
> - x = +1010 → [x]移 = 1,1010
> - x = -1010 → [x]移 = 0,0110
#### 四种编码对比
| 编码 | 符号位 | 零的表示 | 范围 | 运算 |
|------|--------|----------|------|------|
| 原码 | 0正1负 | 两种 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | 复杂 |
| 补码 | 0正1负 | 唯一 | $-2^{n-1} \sim +(2^{n-1}-1)$ | 简单 |
| 反码 | 0正1负 | 两种 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | 较复杂 |
| 移码 | 1正0负 | 唯一 | $-2^{n-1} \sim +(2^{n-1}-1)$ | 便于比较 |
**转换关系**
- 正数:原码 = 反码 = 补码
- 负数:补码 = 反码 + 1
---
## 6.2 定点数
### 6.2.1 定点表示
> [!info] 定义
> 小数点位置固定的数
**两种形式**
```mermaid
graph LR
subgraph "定点整数"
A1[符号位] --> B1[数值部分] --> C1[小数点在最后]
end
subgraph "定点小数"
A2[符号位] --> B2[小数点] --> C2[数值部分]
end
```
**表示范围**
| 类型 | 原码范围 | 补码范围 |
|------|----------|----------|
| 定点整数 | $-(2^{n-1}-1) \sim +(2^{n-1}-1)$ | $-2^{n-1} \sim +(2^{n-1}-1)$ |
| 定点小数 | $-(1-2^{-(n-1)}) \sim +(1-2^{-(n-1)})$ | $-1 \sim +(1-2^{-(n-1)})$ |
---
## 6.3 浮点数
### 6.3.1 浮点表示
> [!info] 定义
> 小数点位置可浮动的数,类似科学计数法。
**表示形式**
$$N = S \times r^j$$
- S尾数小数
- j阶码整数
- r基数通常为2
**存储格式**
```mermaid
graph LR
subgraph "浮点数格式"
MS[阶符] --> E[阶码] --> M[数符] --> N[尾数]
end
```
### 6.3.2 浮点数规格化
> [!info] 目的
> 提高精度,使尾数最高位为有效数字。
**规格化条件**
- 原码尾数最高位为1
- 补码:尾数最高位与符号位相反
**左规**尾数左移阶码减1
**右规**尾数右移阶码加1
> [!example] 示例
> 非规格化0.001011 × 2^5
> 左规后0.1011 × 2^2
### 6.3.3 IEEE 754标准
**单精度32位格式**
```mermaid
graph LR
subgraph "IEEE 754 单精度"
S[符号位1位] --> E[阶码8位] --> M[尾数23位]
end
```
**双精度64位格式**
```mermaid
graph LR
subgraph "IEEE 754 双精度"
S[符号位1位] --> E[阶码11位] --> M[尾数52位]
end
```
**特点**
- 隐含尾数最高位1
- 阶码用移码表示偏置值127或1023
- 尾数用原码表示
**数值计算**
$$N = (-1)^S \times 1.M \times 2^{E-127}$$
> [!example] 示例
> 单精度S=0, E=10000010, M=10010000000000000000000
> - 真值 = +1.1001 × 2^(130-127) = +1.1001 × 2^3 = +1100.1 = +12.5
### 6.3.4 浮点数范围
| 类型 | 最小正数 | 最大正数 | 溢出条件 |
|------|----------|----------|----------|
| 规格化 | $2^{-1} \times 2^{-2^{k-1}}$ | $(1-2^{-n}) \times 2^{2^{k-1}-1}$ | 阶码溢出 |
---
## 6.4 定点运算
### 6.4.1 移位运算
#### 算术移位
| 编码 | 左移 | 右移 |
|------|------|------|
| 原码 | 数值左移右补0 | 数值右移左补0 |
| 补码 | 数值左移右补0 | 数值右移,左补符号位 |
| 反码 | 数值左移右补0 | 数值右移,左补符号位 |
#### 逻辑移位
- 逻辑左移高位移出低位补0
- 逻辑右移低位移出高位补0
### 6.4.2 补码加减运算
> [!important] 核心公式
> $$[x+y]_{补} = [x]_{补} + [y]_{补}$$
> $$[x-y]_{补} = [x]_{补} + [-y]_{补}$$
**溢出判断**
| 方法 | 条件 | 说明 |
|------|------|------|
| 单符号位 | 符号位进位与最高位进位异或 | 结果为1则溢出 |
| 双符号位 | 两个符号位不同 | 01正溢10负溢 |
| 变形补码 | 双符号位 | 同上 |
> [!example] 示例
> 8位补码x = +100, y = +100
> - [x]补 = 0,01100100
> - [y]补 = 0,01100100
> - [x+y]补 = 0,11001000+200
> - 结果正确,无溢出
### 6.4.3 乘法运算
#### 原码一位乘法
**算法**
1. 符号位单独处理(异或)
2. 数值部分相乘
3. 部分累加
**流程**
```mermaid
graph TB
A[初始化] --> B{乘数末位}
B -->|1| C[加被乘数]
B -->|0| D[加0]
C --> E[右移部分积]
D --> E
E --> F{n次?}
F -->|否| B
F -->|是| G[得到乘积]
```
#### 补码一位乘法Booth算法
**特点**
- 符号位参与运算
- 最后一步不移位
- 根据乘数末两位决定操作
**操作规则**
| 乘数末两位 | 操作 |
|------------|------|
| 00 | 部分积右移 |
| 01 | 加[x]补,右移 |
| 10 | 加[-x]补,右移 |
| 11 | 部分积右移 |
### 6.4.4 除法运算
#### 原码一位除法(恢复余数法)
**算法**
1. 符号位单独处理
2. 被除数减除数
3. 若够减商1不够减商0恢复余数
4. 左移,重复
#### 加减交替法(不恢复余数法)
**特点**
- 不恢复余数
- 根据余数符号决定下一步操作
**操作规则**
| 余数符号 | 操作 | 商 |
|----------|------|-----|
| 正 | 左移,减除数 | 1 |
| 负 | 左移,加除数 | 0 |
---
## 6.5 浮点运算
### 6.5.1 浮点加减运算
**步骤**
```mermaid
graph TB
A[对阶] --> B[尾数运算]
B --> C[规格化]
C --> D[舍入处理]
D --> E[溢出判断]
```
#### 1. 对阶
**目的**:使两个操作数的阶码相同
**方法**:小阶向大阶看齐,小阶尾数右移
> [!example] 示例
> x = 0.1101 × 2^3, y = 0.1011 × 2^1
> - 对阶y = 0.001011 × 2^3
> - 尾数运算0.1101 + 0.001011 = 0.111111
> - 结果0.111111 × 2^3
#### 2. 尾数运算
- 按定点加减运算规则
- 使用双符号位
#### 3. 规格化
- 左规尾数左移阶码减1
- 右规尾数右移阶码加1
#### 4. 舍入处理
| 方法 | 规则 | 特点 |
|------|------|------|
| 0舍1入 | 移出位为1则入 | 误差小 |
| 恒置1 | 右移后末位置1 | 简单 |
#### 5. 溢出判断
- **上溢**:阶码大于最大值,溢出中断
- **下溢**阶码小于最小值置0
### 6.5.2 浮点乘除运算
**乘法**
$$N_1 \times N_2 = (S_1 \times S_2) \times r^{j_1+j_2}$$
**除法**
$$N_1 / N_2 = (S_1 / S_2) \times r^{j_1-j_2}$$
**步骤**
1. 阶码加/减
2. 尾数乘/除
3. 规格化
4. 溢出判断
---
## 📝 本章小结
### 核心概念
1. **数据表示**:原码、补码、反码、移码
2. **定点数**:小数点位置固定
3. **浮点数**:小数点位置可变,类似科学计数法
4. **运算方法**:移位、加减、乘除
### 关键公式
- **补码加法**$[x+y]_{补} = [x]_{补} + [y]_{补}$
- **补码减法**$[x-y]_{补} = [x]_{补} + [-y]_{补}$
- **浮点数**$N = S \times r^j$
- **IEEE 754**$N = (-1)^S \times 1.M \times 2^{E-127}$
### 重点图示
> [!summary] 必须掌握的内容
> 1. 四种编码方式的转换关系
> 2. 补码加减运算及溢出判断
> 3. 浮点数加减运算步骤
> 4. IEEE 754标准格式
---
## 🧪 自测练习
### 概念题
1. 比较原码、补码、反码的特点。
2. 说明浮点数规格化的目的和方法。
3. 解释IEEE 754标准的格式。
### 计算题
1. 将十进制数转换为补码表示。
2. 进行补码加减运算并判断溢出。
3. 进行浮点数加减运算。
### 分析题
1. 说明Booth算法的原理和步骤。
2. 设计一个浮点加法器的数据通路。
---
## 🔗 相关链接
- [[05_输入输出系统]] - 上一章
- [[07_指令系统]] - 下一章
- [[08_CPU结构与功能]] - 运算器实现
- [[04_存储器]] - 数据存储
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 核心重点*