vault backup: 2026-07-04 12:12:55
This commit is contained in:
477
计算机组成原理/学习笔记/06_运算方法.md
Normal file
477
计算机组成原理/学习笔记/06_运算方法.md
Normal file
@@ -0,0 +1,477 @@
|
||||
# 第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_存储器]] - 数据存储
|
||||
|
||||
---
|
||||
|
||||
*本章难度:⭐⭐⭐⭐⭐ 困难*
|
||||
*重要程度:⭐⭐⭐⭐⭐ 核心重点*
|
||||
Reference in New Issue
Block a user