计算机组成原理第二章 - 定点数与浮点数
:::tip
本页面含有AI生成内容
感谢Copilot的美化排版与样式
:::
计算机组成原理第二章 - 定点数与浮点数
📚 基础知识回顾
1. 🔄 数的进制转换
1.1 十进制转其他进制
🎯 核心方法:
- 整数部分:除基数取余法
- 小数部分:乘基数取整法
📝 十进制转二进制(整数)
方法:除 2 取余法,余数倒序排列
示例:(42)_{10} \rightarrow (?)_2
\begin{aligned}42 \div 2 &= 21 \cdots 0\\21 \div 2 &= 10 \cdots 1\\10 \div 2 &= 5 \cdots 0\\5 \div 2 &= 2 \cdots 1\\2 \div 2 &= 1 \cdots 0\\1 \div 2 &= 0 \cdots 1\end{aligned}✅ 结果: (42)_{10} = (101010)_2
📝 十进制转十六进制
示例:(255)_{10} \rightarrow (?)_{16}
\begin{aligned}255 \div 16 &= 15 \cdots 15_{(F)}\\15 \div 16 &= 0 \cdots 15_{(F)}\end{aligned}✅ 结果: (255)_{10} = (FF)_{16}
1.2 其他进制转十进制
🎯 核心公式:
N = \sum_{i=-m}^{n} d_i \times r^i
其中:r 为基数,d_i 为各位数字,i 为权值
📝 示例1: (1011.01)_2 \rightarrow (?)_{10}
\begin{aligned}&= 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2}\\&= 8 + 0 + 2 + 1 + 0 + 0.25\\&= (11.25)_{10}\end{aligned}📝 示例2: (2A.F)_{16} \rightarrow (?)_{10}
\begin{aligned}&= 2 \times 16^1 + 10 \times 16^0 + 15 \times 16^{-1}\\&= 32 + 10 + 0.9375\\&= (42.9375)_{10}\end{aligned}1.3 小数转换详解
📝 示例: (13.625)_{10} \rightarrow (?)_2
整数部分: 13_{10} = 1101_2
小数部分(乘2取整法):
\begin{aligned}0.625 \times 2 &= 1.25 \quad \text{取整:} 1\\0.25 \times 2 &= 0.5 \quad \text{取整:} 0\\0.5 \times 2 &= 1.0 \quad \text{取整:} 1\end{aligned}✅ 结果: (13.625)_{10} = (1101.101)_2
2. 🔢 负数表示方法
2.1 原码、反码、补码对比
| 编码方式 | 正数 | 负数 | 0的表示 | 运算特点 |
|---|---|---|---|---|
| 原码 | 符号位0 + 真值 | 符号位1 + 真值 | +0, -0两种 | 需要符号位单独处理 |
| 反码 | 与原码相同 | 符号位1 + 数值位取反 | +0, -0两种 | 加法有特殊规则 |
| 补码 | 与原码相同 | 反码 + 1 | 唯一0 | 统一加减法运算 |
📝 示例(8位):
| 数值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +5 | 00000101 |
00000101 |
00000101 |
| -5 | 10000101 |
11111010 |
11111011 |
| +0 | 00000000 |
00000000 |
00000000 |
| -0 | 10000000 |
11111111 |
00000000 |
2.2 补码的优势
⚡ 关键优势:
- 零的唯一表示
- 加减法运算统一
- 硬件实现简单
- 表数范围最大
📝 补码范围: n 位补码表示范围为 [-2^{n-1}, 2^{n-1}-1]
🎯 定点数表示
1. 📖 定点数基础概念
1.1 定义与分类
🔑 定点数: 小数点位置固定的数值表示方法
| 类型 | 定义 | 示例 | 应用场景 |
|---|---|---|---|
| 定点整数 | 小数点在末尾 | 101_2 = 5_{10} |
整数运算 |
| 定点小数 | 小数点在首位后 | 0.1001_2 = 0.5625_{10} |
精密计算 |
💾 存储格式: 符号位(1位) + 数值位(n位) = 总长度 n+1 位
1.2 关键特性对比
| 特性 | 定点数 | 浮点数 |
|---|---|---|
| 📊 表示范围 | 有限,易溢出 | 极大范围 |
| 🎯 精度 | 固定精度 | 动态精度 |
| ⚡ 运算速度 | 快 | 相对较慢 |
| 🔧 硬件复杂度 | 简单 | 复杂 |
| 🔋 功耗 | 低 | 高 |
2. 📊 定点数表示范围
2.1 定点小数(纯小数)
📋 范围对比表:
| 编码类型 | 最大正数 | 最小正数 | 最大负数 | 数据范围 |
|---|---|---|---|---|
| 原码 | 0.111\cdots1 (1-2^{-n}) |
0.000\cdots1 (2^{-n}) |
-0.111\cdots1 (-1+2^{-n}) |
-(1-2^{-n}) \leq X \leq (1-2^{-n}) |
| 补码 | 0.111\cdots1 (1-2^{-n}) |
0.000\cdots1 (2^{-n}) |
-1.000\cdots0 (-1) |
-1 \leq X \leq (1-2^{-n}) |
📝 示例(8位定点小数,n=7):
- 补码范围:
[-1.0000000, +0.1111111]即[-1, 0.9921875]
2.2 定点整数(纯整数)
📋 范围对比表:
| 编码类型 | 最大正数 | 最小负数 | 数据范围 |
|---|---|---|---|
| 原码 | 0111\cdots1 (2^{n-1}-1) |
1111\cdots1 (-(2^{n-1}-1)) |
-(2^{n-1}-1) \leq X \leq (2^{n-1}-1) |
| 补码 | 0111\cdots1 (2^{n-1}-1) |
1000\cdots0 (-2^{n-1}) |
-2^{n-1} \leq X \leq (2^{n-1}-1) |
📝 示例(8位定点整数,n=7):
- 补码范围:
[-128, +127]
3. 🔄 数制转换详解
3.1 十进制 → 二进制定点数
🎯 定点小数转换步骤:
📝 示例: 0.625_{10} \rightarrow 8位定点小数
\begin{aligned}0.625 \times 2 &= 1.25 \quad \text{取整:} 1, \text{余:} 0.25\\0.25 \times 2 &= 0.5 \quad \text{取整:} 0, \text{余:} 0.5\\0.5 \times 2 &= 1.0 \quad \text{取整:} 1, \text{余:} 0\end{aligned}✅ 结果: 0.625_{10} = 0.101_2 = 0\,1010000_{\text{补}}
🎯 定点整数转换:
📝 示例: 5_{10} \rightarrow 8位定点整数
步骤: 5_{10} = 101_2 \rightarrow 0\,0000101_{\text{补}}
3.2 二进制定点数 → 十进制
🎯 定点小数转换公式:
X = \sum_{i=1}^{n} b_i \times 2^{-i}
📝 示例: 1\,0110000_{\text{补}} → 十进制
步骤:
- 符号位为1,表示负数
- 数值位:
0110000 - 按权展开:
0 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} + 0 + \cdots = 0.25 + 0.125 = 0.375 - 补码转换:先减1得反码
1\,0001111,再取反得原码1\,1110000 - 结果:
-0.875
🎯 定点整数转换公式:
X = \sum_{i=0}^{n-1} b_i \times 2^{i}
3.3 编码转换规则
🔄 原码 ↔ 补码:
| 转换方向 | 正数 | 负数 |
|---|---|---|
| 原码→补码 | 不变 | 数值位取反+1 |
| 补码→原码 | 不变 | 减1后数值位取反 |
📝 示例: -5 的编码转换(8位)
\begin{aligned}\text{原码:} &\quad 1\,0000101\\\text{反码:} &\quad 1\,1111010\\\text{补码:} &\quad 1\,1111011\end{aligned}4. ⚡ 定点数运算
4.1 补码加减法
🎯 运算规则:
[A \pm B]_{\text{补}} = [A]_{\text{补}} \pm [B]_{\text{补}}
📝 示例: (-5) + 3(8位)
\begin{aligned}-5: &\quad 1\,1111011\\+3: &\quad 0\,0000011\\\hline\text{和}: &\quad 1\,1111110 = -2\end{aligned}4.2 溢出检测
⚠️ 溢出判断方法:
- 进位标志法:
V = C_{n-1} \oplus C_n - 符号检测法: 同号相加结果异号
📝 溢出示例: 127 + 1(8位补码)
\begin{aligned}127: &\quad 0\,1111111\\+1: &\quad 0\,0000001\\\hline\text{和}: &\quad 1\,0000000 = -128 \quad \text{(溢出)}\end{aligned}检测: C_6 = 1, C_7 = 0 \Rightarrow C_6 \oplus C_7 = 1 → 溢出
5. 💼 定点数应用场景
| 应用领域 | 特点 | 典型应用 |
|---|---|---|
| 🤖 嵌入式系统 | 低功耗、实时性高 | 传感器处理、控制系统 |
| 🎵 数字信号处理 | 高精度、低延迟 | FFT算法、数字滤波器 |
| 💰 金融计算 | 避免浮点误差 | 货币计算、利息计算 |
| 🎮 图形处理 | 并行计算友好 | 像素处理、坐标变换 |
🌊 浮点数表示
1. 🔬 浮点数核心概念
1.1 通用表示形式
🎯 浮点数公式:
N = (-1)^S \times M \times R^E
参数说明:
S:符号位(0=正,1=负)M:尾数(有效数字)E:阶码(指数)R:基数(通常为2)
1.2 IEEE 754标准
📋 单精度(32位)格式:
| 字段 | 位数 | 范围 | 计算规则 |
|---|---|---|---|
符号位 S |
1位 | 0或1 | 0=正数,1=负数 |
阶码 E |
8位 | 0-255 | 实际指数 = E - 127 |
尾数 M |
23位 | 0-8388607 | 实际尾数 = 1.M(规格化) |
📋 双精度(64位)格式:
| 字段 | 位数 | 偏移量 |
|---|---|---|
符号位 S |
1位 | - |
阶码 E |
11位 | 1023 |
尾数 M |
52位 | - |
📝 转换示例: -0.75_{10} → IEEE 754单精度
步骤:
-0.75_{10} = -0.11_2 = -1.1_2 \times 2^{-1}S = 1(负数)E = 126(127 - 1)M = 10000000000000000000000
✅ 结果: 1 01111110 10000000000000000000000
2. 📏 浮点数规格化
2.1 规格化条件
🎯 规格化要求:
\frac{1}{R} \leq |M| < 1 \quad \text{(二进制:} 0.5 \leq |M| < 1\text{)}
📋 补码尾数规格化形式:
| 数值类型 | 规格化形式 | 示例 |
|---|---|---|
| 正数 | 0.1xxx\cdots x |
0.1101000 |
| 负数 | 1.0xxx\cdots x |
1.0011000 |
2.2 规格化判断表
| 二进制补码 | 是否规格化 | 说明 |
|---|---|---|
0.0011010 \times 2^{0010} |
❌ | 尾数首位非1 |
0.1101000 \times 2^{0000} |
✅ | 满足 0.5 \leq M < 1 |
1.1100110 \times 2^{0010} |
❌ | 负数应为1.0xxx形式 |
1.0011000 \times 2^{0000} |
✅ | 满足 -1 \leq M < -0.5 |
3. 📈 浮点数表示范围
3.1 IEEE 754单精度范围
| 数值类型 | 表示范围 | 十进制近似 |
|---|---|---|
| 最大规格化正数 | (2-2^{-23}) \times 2^{127} |
\approx 3.4 \times 10^{38} |
| 最小规格化正数 | 1.0 \times 2^{-126} |
\approx 1.18 \times 10^{-38} |
| 最大非规格化数 | (1-2^{-23}) \times 2^{-126} |
\approx 1.18 \times 10^{-38} |
| 最小非规格化数 | 2^{-23} \times 2^{-126} |
\approx 1.4 \times 10^{-45} |
3.2 溢出处理
| 情况 | 结果 | 表示 |
|---|---|---|
| 上溢 | \pm\infty |
阶码全1,尾数全0 |
| 下溢 | 非规格化数或0 | 阶码全0 |
4. 🔢 阶码与移码
4.1 移码定义
🎯 移码公式:
[X]_{\text{移}} = 2^n + X \quad (-2^n \leq X \leq 2^n-1)
💡 移码特性:
- 零的移码为
10\cdots0 - 真值与移码单调递增
- 便于大小比较
4.2 移码对照表
📋 8位移码示例(n=7,偏移量=128):
| 真值 | 补码 | 移码 | 十进制值 |
|---|---|---|---|
| -128 | 10000000 |
00000000 |
0 |
| -127 | 10000001 |
00000001 |
1 |
| -1 | 11111111 |
01111111 |
127 |
| 0 | 00000000 |
10000000 |
128 |
| 1 | 00000001 |
10000001 |
129 |
| 127 | 01111111 |
11111111 |
255 |
5. ⚙️ 浮点数运算
5.1 加减运算流程
graph LR A[🔄 对阶] --> B[➕ 尾数加减] B --> C[📏 规格化] C --> D[🔄 舍入] D --> E[⚠️ 溢出判断]
style A fill:#e1f5fe style B fill:#f3e5f5 style C fill:#e8f5e8 style D fill:#fff3e0 style E fill:#ffebee5.2 运算步骤详解
🔄 步骤1:对阶(小阶向大阶看齐)
📝 示例: X=2^3 \times 0.1101,Y=2^5 \times 0.1010
- 阶差:
5-3=2 - X尾数右移2位:
X' = 2^5 \times 0.001101
➕ 步骤2:尾数加减
[M_X]_{\text{补}} + [M_Y]_{\text{补}} = 00.001101 + 11.0110 = 11.100101
📏 步骤3:规格化
- 结果:
11.100101→ 左规1位 →11.001010(阶码-1)
🔄 步骤4:舍入
- 0舍1入:
11.001010 \rightarrow 11.00101
⚠️ 步骤5:溢出判断
- 检查阶码是否超出范围
5.3 典型运算示例
📝 题目: X=2^7 \times \frac{29}{32},Y=2^5 \times \frac{5}{8},求X+Y
条件: 阶码5位,尾数7位(含符号位)
解答过程:
-
对阶:
[X]_{\text{补}} = 00111\,00.11101[Y]_{\text{补}} = 00111\,00.0010100
-
尾数运算:
00.11101 + 00.00101 = 01.00010→ 尾数溢出
-
右规处理:
- 尾数:
00.10001,阶码+1 →01000\,00.10001
- 尾数:
-
溢出判断:
- 阶码
01000超出5位最大值01111→ 上溢
- 阶码
6. 🚨 浮点数特殊值
📋 IEEE 754特殊值编码:
| 阶码E | 尾数M | 含义 | 示例 |
|---|---|---|---|
| 全0 | 全0 | \pm 0 |
0 00000000 000...000 |
| 全0 | 非全0 | 非规格化数 | 0 00000000 000...001 |
| 全1 | 全0 | \pm \infty |
0 11111111 000...000 |
| 全1 | 非全0 | NaN | 0 11111111 000...001 |
7. ⚠️ 浮点数运算误差
7.1 误差来源
| 误差类型 | 产生原因 | 影响 |
|---|---|---|
| 对阶误差 | 尾数右移丢失低位 | 精度损失 |
| 舍入误差 | 位数限制近似 | 累积误差 |
| 运算误差 | 多次操作叠加 | 结果偏差 |
7.2 误差控制方法
- 🎯 双精度运算: 提高尾数精度
- 📊 误差分析: 估算精度损失
- 🔧 特殊算法: Kahan求和等
📝 精度损失示例:
1.0 + 2^{-24} = 1.0 + 0.0000000596\cdots \approx 1.0 \quad \text{(单精度丢失)}
📝 重要公式总结
🎯 核心公式速查
| 类别 | 公式 | 说明 |
| –––––––––– | ———————————————— | –––––––– | –– | ———— |
| 进制转换 | N = \sum_{i=-m}^{n} d_i \times r^i | 任意进制转十进制 |
| 浮点数 | N = (-1)^S \times M \times 2^{E-\text{偏移量}} | IEEE 754标准 |
| 补码范围 | [-2^{n-1}, 2^{n-1}-1] | n位补码表示范围 |
| 定点小数(原码) | [-(1-2^{-n}), (1-2^{-n})] | 原码小数范围 |
| 定点小数(补码) | [-1, (1-2^{-n})] | 补码小数范围 |
| 定点整数(补码) | [-2^{n-1}, 2^{n-1}-1] | 补码整数范围 |
| 溢出检测 | V = C_{n-1} \oplus C_n | 补码溢出判断 |
| 移码转换 | [X]_{\text{移}} = 2^n + X | 移码公式 |
| 规格化条件 | 0.5 \leq | M | < 1 | 二进制规格化 |
🔍 重要常数
| 标准 | 偏移量 | 表示范围 |
|---|---|---|
| IEEE 754单精度 | 127 | \pm 3.4 \times 10^{38} |
| IEEE 754双精度 | 1023 | \pm 1.8 \times 10^{308} |
📚 复习要点
⭐ 重点掌握
- 🔄 进制转换: 熟练掌握各种进制间的转换方法
- ⚡ 补码运算: 理解补码的优势和运算规则
- 📏 定点数范围: 记住不同编码的表示范围
- 🌊 浮点数格式: 掌握IEEE 754标准格式
- ⚙️ 浮点运算: 理解五步运算流程
- ⚠️ 溢出检测: 掌握各种溢出判断方法
🎯 常考题型
- 进制转换计算
- 原码/反码/补码互转
- 定点数运算与溢出判断
- IEEE 754格式转换
- 浮点数加减运算
- 特殊值识别
💡 记忆技巧
- 补码优势: “统一运算,唯一零值”
- 浮点运算: “对阶→加减→规格→舍入→溢出”
- IEEE 754: “1+8+23=32位单精度,1+11+52=64位双精度”
计算机组成原理第二章 - 定点数与浮点数
作者:xingwangzhe
本文链接:https://xingwangzhe.fun/posts/4f16228c/
本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
留言评论