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

发布时间:
更新时间:
🕒 阅读时间:14 min read 👀 阅读量:Loading...
💡

本页面含有AI生成内容

感谢Copilot的美化排版与样式

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

📚 基础知识回顾

1. 🔄 数的进制转换

1.1 十进制转其他进制

🎯 核心方法:

  • 整数部分:除基数取余法
  • 小数部分:乘基数取整法

📝 十进制转二进制(整数)

方法:除 2 取余法,余数倒序排列

示例(42)10(?)2(42)_{10} \rightarrow (?)_2

42÷2=21021÷2=10110÷2=505÷2=212÷2=101÷2=01\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(42)_{10} = (101010)_2

📝 十进制转十六进制

示例(255)10(?)16(255)_{10} \rightarrow (?)_{16}

255÷16=1515(F)15÷16=015(F)\begin{aligned} 255 \div 16 &= 15 \cdots 15_{(F)}\\ 15 \div 16 &= 0 \cdots 15_{(F)} \end{aligned}

✅ 结果: (255)10=(FF)16(255)_{10} = (FF)_{16}

1.2 其他进制转十进制

🎯 核心公式:

N=i=mndi×riN = \sum_{i=-m}^{n} d_i \times r^i

其中:rr 为基数,did_i 为各位数字,ii 为权值

📝 示例1: (1011.01)2(?)10(1011.01)_2 \rightarrow (?)_{10}

=1×23+0×22+1×21+1×20+0×21+1×22=8+0+2+1+0+0.25=(11.25)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(?)10(2A.F)_{16} \rightarrow (?)_{10}

=2×161+10×160+15×161=32+10+0.9375=(42.9375)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(?)2(13.625)_{10} \rightarrow (?)_2

整数部分: 1310=1101213_{10} = 1101_2

小数部分(乘2取整法):

0.625×2=1.25取整:10.25×2=0.5取整:00.5×2=1.0取整:1\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(13.625)_{10} = (1101.101)_2

2. 🔢 负数表示方法

2.1 原码、反码、补码对比

编码方式正数负数0的表示运算特点
原码符号位0 + 真值符号位1 + 真值+0, -0两种需要符号位单独处理
反码与原码相同符号位1 + 数值位取反+0, -0两种加法有特殊规则
补码与原码相同反码 + 1唯一0统一加减法运算

📝 示例(8位):

数值原码反码补码
+5000001010000010100000101
-5100001011111101011111011
+0000000000000000000000000
-0100000001111111100000000

2.2 补码的优势

⚡ 关键优势:

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

📝 补码范围: nn 位补码表示范围为 [2n1,2n11][-2^{n-1}, 2^{n-1}-1]


🎯 定点数表示

1. 📖 定点数基础概念

1.1 定义与分类

🔑 定点数: 小数点位置固定的数值表示方法

类型定义示例应用场景
定点整数小数点在末尾1012=510101_2 = 5_{10}整数运算
定点小数小数点在首位后0.10012=0.5625100.1001_2 = 0.5625_{10}精密计算

💾 存储格式: 符号位(1位) + 数值位(n位) = 总长度 n+1n+1

1.2 关键特性对比

特性定点数浮点数
📊 表示范围有限,易溢出极大范围
🎯 精度固定精度动态精度
运算速度相对较慢
🔧 硬件复杂度简单复杂
🔋 功耗

2. 📊 定点数表示范围

2.1 定点小数(纯小数)

📋 范围对比表:

编码类型最大正数最小正数最大负数数据范围
原码0.11110.111\cdots1
(12n)(1-2^{-n})
0.00010.000\cdots1
(2n)(2^{-n})
0.1111-0.111\cdots1
(1+2n)(-1+2^{-n})
(12n)X(12n)-(1-2^{-n}) \leq X \leq (1-2^{-n})
补码0.11110.111\cdots1
(12n)(1-2^{-n})
0.00010.000\cdots1
(2n)(2^{-n})
1.0000-1.000\cdots0
(1)(-1)
1X(12n)-1 \leq X \leq (1-2^{-n})

📝 示例(8位定点小数,n=7n=7):

  • 补码范围: [1.0000000,+0.1111111][-1.0000000, +0.1111111][1,0.9921875][-1, 0.9921875]

2.2 定点整数(纯整数)

📋 范围对比表:

编码类型最大正数最小负数数据范围
原码011110111\cdots1
(2n11)(2^{n-1}-1)
111111111\cdots1
((2n11))(-(2^{n-1}-1))
(2n11)X(2n11)-(2^{n-1}-1) \leq X \leq (2^{n-1}-1)
补码011110111\cdots1
(2n11)(2^{n-1}-1)
100001000\cdots0
(2n1)(-2^{n-1})
2n1X(2n11)-2^{n-1} \leq X \leq (2^{n-1}-1)

📝 示例(8位定点整数,n=7n=7):

  • 补码范围: [128,+127][-128, +127]

3. 🔄 数制转换详解

3.1 十进制 → 二进制定点数

🎯 定点小数转换步骤:

📝 示例: 0.6251080.625_{10} \rightarrow 8位定点小数

0.625×2=1.25取整:1,余:0.250.25×2=0.5取整:0,余:0.50.5×2=1.0取整:1,余:0\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.62510=0.1012=010100000.625_{10} = 0.101_2 = 0\,1010000_{\text{补}}

🎯 定点整数转换:

📝 示例: 51085_{10} \rightarrow 8位定点整数

步骤: 510=1012000001015_{10} = 101_2 \rightarrow 0\,0000101_{\text{补}}

3.2 二进制定点数 → 十进制

🎯 定点小数转换公式:

X=i=1nbi×2iX = \sum_{i=1}^{n} b_i \times 2^{-i}

📝 示例: 101100001\,0110000_{\text{补}} → 十进制

步骤:

  1. 符号位为1,表示负数
  2. 数值位:01100000110000
  3. 按权展开:0×21+1×22+1×23+0+=0.25+0.125=0.3750 \times 2^{-1} + 1 \times 2^{-2} + 1 \times 2^{-3} + 0 + \cdots = 0.25 + 0.125 = 0.375
  4. 补码转换:先减1得反码 100011111\,0001111,再取反得原码 111100001\,1110000
  5. 结果: 0.875-0.875

🎯 定点整数转换公式:

X=i=0n1bi×2iX = \sum_{i=0}^{n-1} b_i \times 2^{i}

3.3 编码转换规则

🔄 原码 ↔ 补码:

转换方向正数负数
原码→补码不变数值位取反+1
补码→原码不变减1后数值位取反

📝 示例: 5-5 的编码转换(8位)

原码:10000101反码:11111010补码:11111011\begin{aligned} \text{原码:} &\quad 1\,0000101\\ \text{反码:} &\quad 1\,1111010\\ \text{补码:} &\quad 1\,1111011 \end{aligned}

4. ⚡ 定点数运算

4.1 补码加减法

🎯 运算规则:

[A±B]=[A]±[B][A \pm B]_{\text{补}} = [A]_{\text{补}} \pm [B]_{\text{补}}

📝 示例: (5)+3(-5) + 3(8位)

5:11111011+3:00000011:11111110=2\begin{aligned} -5: &\quad 1\,1111011\\ +3: &\quad 0\,0000011\\ \hline \text{和}: &\quad 1\,1111110 = -2 \end{aligned}

4.2 溢出检测

⚠️ 溢出判断方法:

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

📝 溢出示例: 127+1127 + 1(8位补码)

127:01111111+1:00000001:10000000=128❌溢出\begin{aligned} 127: &\quad 0\,1111111\\ +1: &\quad 0\,0000001\\ \hline \text{和}: &\quad 1\,0000000 = -128 \quad \text{❌溢出} \end{aligned}

检测: C6=1,C7=0C6C7=1C_6 = 1, C_7 = 0 \Rightarrow C_6 \oplus C_7 = 1 → 溢出

5. 💼 定点数应用场景

应用领域特点典型应用
🤖 嵌入式系统低功耗、实时性高传感器处理、控制系统
🎵 数字信号处理高精度、低延迟FFT算法、数字滤波器
💰 金融计算避免浮点误差货币计算、利息计算
🎮 图形处理并行计算友好像素处理、坐标变换

🌊 浮点数表示

1. 🔬 浮点数核心概念

1.1 通用表示形式

🎯 浮点数公式:

N=(1)S×M×REN = (-1)^S \times M \times R^E

参数说明:

  • SS符号位(0=正,1=负)
  • MM尾数(有效数字)
  • EE阶码(指数)
  • RR基数(通常为2)

1.2 IEEE 754标准

📋 单精度(32位)格式:

字段位数范围计算规则
符号位 SS1位0或10=正数,1=负数
阶码 EE8位0-255实际指数 = E127E - 127
尾数 MM23位0-8388607实际尾数 = 1.M1.M(规格化)

📋 双精度(64位)格式:

字段位数偏移量
符号位 SS1位-
阶码 EE11位1023
尾数 MM52位-

📝 转换示例: 0.7510-0.75_{10} → IEEE 754单精度

步骤:

  1. 0.7510=0.112=1.12×21-0.75_{10} = -0.11_2 = -1.1_2 \times 2^{-1}
  2. S=1S = 1(负数)
  3. E=126E = 1261271127 - 1
  4. M=10000000000000000000000M = 10000000000000000000000

✅ 结果: 1 01111110 10000000000000000000000

2. 📏 浮点数规格化

2.1 规格化条件

🎯 规格化要求:

1RM<1(二进制:0.5M<1\frac{1}{R} \leq |M| < 1 \quad \text{(二进制:} 0.5 \leq |M| < 1\text{)}

📋 补码尾数规格化形式:

数值类型规格化形式示例
正数0.1xxxx0.1xxx\cdots x0.11010000.1101000
负数1.0xxxx1.0xxx\cdots x1.00110001.0011000

2.2 规格化判断表

二进制补码是否规格化说明
0.0011010×200100.0011010 \times 2^{0010}尾数首位非1
0.1101000×200000.1101000 \times 2^{0000}满足 0.5M<10.5 \leq M < 1
1.1100110×200101.1100110 \times 2^{0010}负数应为1.0xxx1.0xxx形式
1.0011000×200001.0011000 \times 2^{0000}满足 1M<0.5-1 \leq M < -0.5

3. 📈 浮点数表示范围

3.1 IEEE 754单精度范围

数值类型表示范围十进制近似
最大规格化正数(2223)×2127(2-2^{-23}) \times 2^{127}3.4×1038\approx 3.4 \times 10^{38}
最小规格化正数1.0×21261.0 \times 2^{-126}1.18×1038\approx 1.18 \times 10^{-38}
最大非规格化数(1223)×2126(1-2^{-23}) \times 2^{-126}1.18×1038\approx 1.18 \times 10^{-38}
最小非规格化数223×21262^{-23} \times 2^{-126}1.4×1045\approx 1.4 \times 10^{-45}

3.2 溢出处理

情况结果表示
上溢±\pm\infty阶码全1,尾数全0
下溢非规格化数或0阶码全0

4. 🔢 阶码与移码

4.1 移码定义

🎯 移码公式:

[X]=2n+X(2nX2n1)[X]_{\text{移}} = 2^n + X \quad (-2^n \leq X \leq 2^n-1)

💡 移码特性:

  • 零的移码为 10010\cdots0
  • 真值与移码单调递增
  • 便于大小比较

4.2 移码对照表

📋 8位移码示例(n=7n=7,偏移量=128):

真值补码移码十进制值
-12810000000000000000
-12710000001000000011
-11111111101111111127
00000000010000000128
10000000110000001129
1270111111111111111255

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=23×0.1101X=2^3 \times 0.1101Y=25×0.1010Y=2^5 \times 0.1010

  • 阶差:53=25-3=2
  • X尾数右移2位:X=25×0.001101X' = 2^5 \times 0.001101

➕ 步骤2:尾数加减

[MX]+[MY]=00.001101+11.0110=11.100101[M_X]_{\text{补}} + [M_Y]_{\text{补}} = 00.001101 + 11.0110 = 11.100101

📏 步骤3:规格化

  • 结果:11.10010111.100101 → 左规1位 → 11.00101011.001010(阶码-1)

🔄 步骤4:舍入

  • 0舍1入:11.00101011.0010111.001010 \rightarrow 11.00101

⚠️ 步骤5:溢出判断

  • 检查阶码是否超出范围

5.3 典型运算示例

📝 题目: X=27×2932X=2^7 \times \frac{29}{32}Y=25×58Y=2^5 \times \frac{5}{8},求X+YX+Y

条件: 阶码5位,尾数7位(含符号位)

解答过程:

  1. 对阶:

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

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

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

    • 阶码0100001000超出5位最大值0111101111上溢

6. 🚨 浮点数特殊值

📋 IEEE 754特殊值编码:

阶码E尾数M含义示例
全0全0±0\pm 00 00000000 000...000
全0非全0非规格化数0 00000000 000...001
全1全0±\pm \infty0 11111111 000...000
全1非全0NaN0 11111111 000...001

7. ⚠️ 浮点数运算误差

7.1 误差来源

误差类型产生原因影响
对阶误差尾数右移丢失低位精度损失
舍入误差位数限制近似累积误差
运算误差多次操作叠加结果偏差

7.2 误差控制方法

  • 🎯 双精度运算: 提高尾数精度
  • 📊 误差分析: 估算精度损失
  • 🔧 特殊算法: Kahan求和等

📝 精度损失示例:

1.0+224=1.0+0.00000005961.0(单精度丢失)1.0 + 2^{-24} = 1.0 + 0.0000000596\cdots \approx 1.0 \quad \text{(单精度丢失)}


📝 重要公式总结

🎯 核心公式速查

类别公式说明
进制转换N=i=mndi×riN = \sum_{i=-m}^{n} d_i \times r^i任意进制转十进制
浮点数N=(1)S×M×2E偏移量N = (-1)^S \times M \times 2^{E-\text{偏移量}}IEEE 754标准
补码范围[2n1,2n11][-2^{n-1}, 2^{n-1}-1]n位补码表示范围
定点小数(原码)[(12n),(12n)][-(1-2^{-n}), (1-2^{-n})]原码小数范围
定点小数(补码)[1,(12n)][-1, (1-2^{-n})]补码小数范围
定点整数(补码)[2n1,2n11][-2^{n-1}, 2^{n-1}-1]补码整数范围
溢出检测V=Cn1CnV = C_{n-1} \oplus C_n补码溢出判断
移码转换[X]=2n+X[X]_{\text{移}} = 2^n + X移码公式
规格化条件$0.5 \leqM

🔍 重要常数

标准偏移量表示范围
IEEE 754单精度127±3.4×1038\pm 3.4 \times 10^{38}
IEEE 754双精度1023±1.8×10308\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 国际许可协议 进行许可。

留言评论

2000年1月1日星期六
00:00:00