---
title: 计算机组成原理第二章 - 定点数与浮点数
abbrlink: 4f16228c
date: "2025-09-14 18:06:25"
updated: "2025-09-15 17:36:01"
desc: "示例：$(42)_{10} \\rightarrow (?)_2$"
categories:
    - 计算机组成原理
tags:
    - 计算机组成原理
    - 定点数
    - 浮点数
---

:::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$ <br> $(1-2^{-n})$ | $0.000\cdots1$ <br> $(2^{-n})$ | $-0.111\cdots1$ <br> $(-1+2^{-n})$ | $-(1-2^{-n}) \leq X \leq (1-2^{-n})$ |
| **补码** | $0.111\cdots1$ <br> $(1-2^{-n})$ | $0.000\cdots1$ <br> $(2^{-n})$ | $-1.000\cdots0$ <br> $(-1)$        | $-1 \leq X \leq (1-2^{-n})$          |

**📝 示例（8位定点小数，$n=7$）：**

- **补码范围：** $[-1.0000000, +0.1111111]$ 即 $[-1, 0.9921875]$

#### 2.2 **定点整数（纯整数）**

**📋 范围对比表：**

| 编码类型 | **最大正数**                     | **最小负数**                        | **数据范围**                           |
| -------- | -------------------------------- | ----------------------------------- | -------------------------------------- |
| **原码** | $0111\cdots1$ <br> $(2^{n-1}-1)$ | $1111\cdots1$ <br> $(-(2^{n-1}-1))$ | $-(2^{n-1}-1) \leq X \leq (2^{n-1}-1)$ |
| **补码** | $0111\cdots1$ <br> $(2^{n-1}-1)$ | $1000\cdots0$ <br> $(-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 = 126$（$127 - 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 **加减运算流程**

```mermaid
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.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位（含符号位）

**解答过程：**

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/](https://xingwangzhe.fun/posts/4f16228c/)

本文采用[知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-sa/4.0/)进行许可。