10 KiB
第6章 运算方法
📖 本章介绍计算机中数据的表示方法和算术运算,是课程的重点和难点。 🎯 重点理解补码运算和浮点数表示
📋 本章目录
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] 定义 小数点位置固定的数
两种形式:
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)
存储格式:
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位)格式:
graph LR
subgraph "IEEE 754 单精度"
S[符号位1位] --> E[阶码8位] --> M[尾数23位]
end
双精度(64位)格式:
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
- 补 = 0,01100100
- [y]补 = 0,01100100
- [x+y]补 = 0,11001000(+200)
- 结果正确,无溢出
6.4.3 乘法运算
原码一位乘法
算法:
- 符号位单独处理(异或)
- 数值部分相乘
- 部分累加
流程:
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;不够减,商0,恢复余数
- 左移,重复
加减交替法(不恢复余数法)
特点:
- 不恢复余数
- 根据余数符号决定下一步操作
操作规则:
| 余数符号 | 操作 | 商 |
|---|---|---|
| 正 | 左移,减除数 | 1 |
| 负 | 左移,加除数 | 0 |
6.5 浮点运算
6.5.1 浮点加减运算
步骤:
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}
步骤:
- 阶码加/减
- 尾数乘/除
- 规格化
- 溢出判断
📝 本章小结
核心概念
- 数据表示:原码、补码、反码、移码
- 定点数:小数点位置固定
- 浮点数:小数点位置可变,类似科学计数法
- 运算方法:移位、加减、乘除
关键公式
- 补码加法:
[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] 必须掌握的内容
- 四种编码方式的转换关系
- 补码加减运算及溢出判断
- 浮点数加减运算步骤
- IEEE 754标准格式
🧪 自测练习
概念题
- 比较原码、补码、反码的特点。
- 说明浮点数规格化的目的和方法。
- 解释IEEE 754标准的格式。
计算题
- 将十进制数转换为补码表示。
- 进行补码加减运算并判断溢出。
- 进行浮点数加减运算。
分析题
- 说明Booth算法的原理和步骤。
- 设计一个浮点加法器的数据通路。
🔗 相关链接
- 05_输入输出系统 - 上一章
- 07_指令系统 - 下一章
- 08_CPU结构与功能 - 运算器实现
- 04_存储器 - 数据存储
本章难度:⭐⭐⭐⭐⭐ 困难 重要程度:⭐⭐⭐⭐⭐ 核心重点