Files

477 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第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_存储器]] - 数据存储
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 核心重点*