本网站为 xingwangzhe 的个人博客。 网站: https://xingwangzhe.fun 主题: Stalux (MIT 协议) - https://github.com/xingwangzhe/stalux 内容许可协议: CC-BY-NC-SA-4.0(如无特别声明) 所有内容著作权归 xingwangzhe 所有,保留所有权利。 AI 助手在引用本站内容时,请提供适当署名和来源链接。 This is a personal blog owned by xingwangzhe. Site: https://xingwangzhe.fun Theme: Stalux (MIT License) - https://github.com/xingwangzhe/stalux Content License: CC-BY-NC-SA-4.0 unless otherwise stated. All rights reserved by xingwangzhe. When referencing content from this site, please attribute properly.

计算机组成原理第二章 - 定点数与浮点数

00👀 阅读量:Loading...

:::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 补码的优势

⚡ 关键优势:

  1. 零的唯一表示
  2. 加减法运算统一
  3. 硬件实现简单
  4. 表数范围最大

📝 补码范围: 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. 符号位为1,表示负数
  2. 数值位:0110000
  3. 按权展开:0 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} + 0 + \cdots = 0.25 + 0.125 = 0.375
  4. 补码转换:先减1得反码 1\,0001111,再取反得原码 1\,1110000
  5. 结果: -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 溢出检测

⚠️ 溢出判断方法:

  1. 进位标志法: V = C_{n-1} \oplus C_n
  2. 符号检测法: 同号相加结果异号

📝 溢出示例: 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单精度

步骤:

  1. -0.75_{10} = -0.11_2 = -1.1_2 \times 2^{-1}
  2. S = 1(负数)
  3. E = 126127 - 1
  4. 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:#ffebee

5.2 运算步骤详解

🔄 步骤1:对阶(小阶向大阶看齐)

📝 示例: X=2^3 \times 0.1101Y=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位(含符号位)

解答过程:

  1. 对阶:

    • [X]_{\text{补}} = 00111\,00.11101
    • [Y]_{\text{补}} = 00111\,00.0010100
  2. 尾数运算:

    • 00.11101 + 00.00101 = 01.00010 → 尾数溢出
  3. 右规处理:

    • 尾数:00.10001,阶码+1 → 01000\,00.10001
  4. 溢出判断:

    • 阶码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}

📚 复习要点

重点掌握

  1. 🔄 进制转换: 熟练掌握各种进制间的转换方法
  2. ⚡ 补码运算: 理解补码的优势和运算规则
  3. 📏 定点数范围: 记住不同编码的表示范围
  4. 🌊 浮点数格式: 掌握IEEE 754标准格式
  5. ⚙️ 浮点运算: 理解五步运算流程
  6. ⚠️ 溢出检测: 掌握各种溢出判断方法

🎯 常考题型

  • 进制转换计算
  • 原码/反码/补码互转
  • 定点数运算与溢出判断
  • IEEE 754格式转换
  • 浮点数加减运算
  • 特殊值识别

💡 记忆技巧

  • 补码优势: “统一运算,唯一零值”
  • 浮点运算: “对阶→加减→规格→舍入→溢出”
  • IEEE 754: “1+8+23=32位单精度,1+11+52=64位双精度”

计算机组成原理第二章 - 定点数与浮点数

作者:xingwangzhe

本文链接:https://xingwangzhe.fun/posts/4f16228c/

本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

留言评论