第3章 运算方法和运算部件
计算机中的数据以二进制表示,分为数值数据(定点数、浮点数)和非数值数据。运算器(ALU)是执行算术和逻辑运算的核心部件,包括加减乘除及浮点运算。
3.1 数值型数据的表示和转换
无符号数
所有二进制位均用于表示数值,ω位二进制序列表示范围:0 ~ 2^ω - 1。
B2Uω(x) = Σ xi × 2^i (i = 0 ~ ω-1)
十进制数转换
- 十进制→二进制:整数除2取余,小数乘2取整
- 二进制→十进制:按权展开求和
BCD码
BCD码(Binary Coded Decimal):用4位二进制编码表示1位十进制数。BCD码加减运算需加6修正(若相加结果大于9或产生进位,则加6调整)。
3.2 带符号的二进制数据在计算机中的表示方法
真值和机器数
- 真值:数据实际的数值
- 机器数:二进制表示(符号数值化)
四种编码
| 编码 | 正数表示 | 负数表示 | 0的表示 | 范围(n+1位) |
|---|---|---|---|---|
| 原码 | 符号位0+数值 | 符号位1+数值 | +0和-0 | -(2^n-1) ~ +(2^n-1) |
| 反码 | 同原码 | 原码数值位取反 | +0和-0 | -(2^n-1) ~ +(2^n-1) |
| 补码 | 同原码 | 反码+1 | 唯一0 | -2^n ~ +(2^n-1) |
| 移码 | 补码符号位取反 | 补码符号位取反 | 唯一0 | -2^n ~ +(2^n-1) |
补码的本质:补码 = 模 - |负数|,使负数转化为等价的正数参与加法运算。
三种编码的区别(重点):
- 正数时原码、补码、反码都等于真值本身
- 补码和反码的符号位可作为数值位参与运算;原码的符号位必须分开处理
- 原码和反码有±0两种形式,补码只有唯一0
- 补码负数范围比正数多一个最负的数
定点数
定点小数(n+1位格式:XS.X1X2…Xn):
| 项目 | 原码 | 补码 |
|---|---|---|
| 最大正数 | 1-2^(-n) | 1-2^(-n) |
| 最小正数 | 2^(-n) | 2^(-n) |
| 绝对值最大负数 | -(1-2^(-n)) | -1 |
| 表示范围 | -(1-2^(-n))~+(1-2^(-n)) | -1~+(1-2^(-n)) |
定点整数(n+1位格式:XS X1X2…Xn):
| 项目 | 原码 | 补码 |
|---|---|---|
| 最大正数 | 2^n-1 | 2^n-1 |
| 最小正数 | 1 | 1 |
| 绝对值最大负数 | -(2^n-1) | -2^n |
| 表示范围 | -(2^n-1)~+(2^n-1) | -2^n~+(2^n-1) |
模的计算:定点小数模=2,定点整数模=2^(n+1)。
3.3 浮点数的表示方法
浮点数格式
浮点数 = 阶码(E) + 尾数(M)。阶码决定范围,尾数决定精度。
浮点数表示范围(补码,n+1位尾数,k+1位阶码)
| 项目 | 公式 |
|---|---|
| 最大正数 | (1-2^(-n)) × 2^(2^k-1) |
| 最小正数 | 2^(-n) × 2^(-2^k) |
| 绝对值最大负数 | (-1) × 2^(2^k-1) |
上溢:超出最大范围,CPU发溢出中断;下溢:小于最小正数,视为0。
规格化
| 类型 | 原码规格化 | 补码规格化 |
|---|---|---|
| 正数 | 0.1×××… | 0.1×××… |
| 负数 | 1.1×××… | 1.0×××… |
IEEE 754标准
| 类型 | 总位数 | 阶码 | 尾数 | 偏置值 | 范围 |
|---|---|---|---|---|---|
| 单精度(float) | 32 | 8 | 23 | 127 | ±10^±38 |
| 双精度(double) | 64 | 11 | 52 | 1023 | ±10^±308 |
数 = (-1)^S × (1 + M) × 2^(E - 偏置值)
特殊值:全0阶+全0尾→±0;全1阶+全0尾→±∞;全1阶+非0尾→NaN。
3.4 带符号数的移位与符号扩展
移位规则
| 机器数 | 左移空出位 | 右移空出位 |
|---|---|---|
| 正数(原/补/反) | 补0 | 补0 |
| 负数原码 | 补0 | 补0 |
| 负数反码 | 补1 | 补1 |
| 负数补码 | 补0 | 补1 |
符号扩展
| 机器数类型 | 扩展规则 |
|---|---|
| 正数(原码/补码/反码) | 附加高位全部填充0 |
| 负数原码 | 附加高位填充0,符号位保持1 |
| 负数补码 | 附加高位全部填充1 |
3.5 溢出判断
单符号位法
正+正=负 → 溢出;负+负=正 → 溢出。
双符号位法(变形补码)
S1S2 = 00 → 正数;S1S2 = 11 → 负数;S1S2 = 01 → 正溢出;S1S2 = 10 → 负溢出。溢出 = S1 ⊕ S2。
3.6 二进制乘法运算
原码一位乘法
符号位单独处理,数值位相乘。用绝对值进行乘加,右移部分积。
补码一位乘法(Booth算法)
| y_n | y_{n+1} | 操作 |
|---|---|---|
| 0 | 0 | 右移一位 |
| 0 | 1 | 加[X]补,右移一位 |
| 1 | 0 | 加[-X]补,右移一位 |
| 1 | 1 | 右移一位 |
重复n+1次,最后一步不移位。
原码两位乘法
| Yi-1 | Yi | 操作 |
|---|---|---|
| 0 | 0 | +0,右移两位 |
| 0 | 1 | +|X|,右移两位 |
| 1 | 0 | +2|X|,右移两位 |
| 1 | 1 | +3|X|(执行-|X|,欠帐+4X用C记录),右移两位 |
3.7 除法运算
不恢复余数法(加减交替法)
第一步:余=被除数-除数(余为正→溢出终止)。 之后每步:余≥0→商1,余左移后减除数;余<0→商0,余左移后加除数。 重复n次,最后余数×2^(-n)为真正余数。
补码不恢复余数法
比较大小:同号做减法,异号做加法。 上商:同号够减商1不够减商0;异号够减商0不够减商1。 末位恒置1,商为负时最低位加1修正。
3.8 运算部件
全加器
Si = Ai ⊕ Bi ⊕ Ci-1
Ci = AiBi + Ci-1(Ai ⊕ Bi)
先行进位
进位传递函数 Pi = Ai ⊕ Bi,进位产生函数 Gi = AiBi Ci = Gi + Pi·Ci-1
4位一组先行进位:Cn+4 = G* + P*·Cn 组进位产生函数 G* = G3 + P3G2 + P2P3G1 + P0P1P2P3G0 组进位传递函数 P* = P0P1P2P3
ALU逻辑表达式
ALU的核心是运算函数发生器(Xi、Yi生成)和全加器(Fi、Cn+i+1):
Xi = f(Ai, Bi, S0, S1)
Yi = f(Ai, Bi, S2, S3)
Fi = Xi ⊕ Yi ⊕ Cn+i
Cn+i+1 = XiYi + Cn+i(Xi ⊕ Yi)
3.9 浮点数的运算方法
浮点加减法
- 对阶:小阶向大阶看齐,小阶尾数右移
- 尾数运算:对阶后的尾数进行加/减
- 规格化:左规或右规
- 舍入:0舍1入
- 判溢出:阶码溢出判断
浮点乘除法
阶码相加/减,尾数乘/除,再规格化。
3.10 数据校验码
奇偶校验码
在数据位后加一位校验位,使1的个数为奇数(奇校验)或偶数(偶校验)。只能检测奇数位错,无法纠错。
海明校验码
数据位k位,校验位r位满足:2^r ≥ k + r + 1
校验位Pi放在位号2^(i-1)的位置。被校验的每一位位号=校验它的各校验位的位号之和。
检错标志:全0→无错;仅一位非0→校验位错;两位非0→两位错;三位非0→数据位错,S4~S1指明出错位。
CRC校验码
CRC编码 = 数据字 + 余数,余数 = (M(x) × X^r) mod G(x)
循环纠错:余数=0→无错;余数=101→左起第1位错;余数非0非101→继续除,除n-1次得101→左起第n位错。
考试重点
★★★ 第一梯队(必考)
| 考点 | 典型题型 |
|---|---|
| 原码/反码/补码/移码转换和对比 | 计算 + 简答 |
| 定点数表示范围(含最小正数) | 计算 |
| IEEE754浮点数转换 | 十进制↔二进制浮点数格式 |
| 海明校验码和CRC校验码 | 计算校验位 + 定位错位 |
★★☆ 第二梯队
| 考点 | 典型题型 |
|---|---|
| 浮点数表示范围 | 计算 |
| 补码一位乘法(Booth算法) | 计算 |
| 不恢复余数法 | 计算 |
| 浮点加减运算步骤 | 流程描述 + 计算 |
| 溢出判断(双符号位法) | 判断 + 简答 |
| 先行进位和ALU逻辑表达式 | 推导 + 简答 |
| 移位规则和符号扩展 | 填空/判断 |
★☆☆ 第三梯队
| 考点 | 典型题型 |
|---|---|
| 无符号数 B2U 函数 | 概念题 |
| BCD码加6修正 | 计算 |
| 浮点数规格化 | 判断 + 转换 |
| 三种编码区别(符号位/0表示/范围) | 简答 |