第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)

补码的本质:补码 = 模 - |负数|,使负数转化为等价的正数参与加法运算。

三种编码的区别(重点):

  1. 正数时原码、补码、反码都等于真值本身
  2. 补码和反码的符号位可作为数值位参与运算;原码的符号位必须分开处理
  3. 原码和反码有±0两种形式,补码只有唯一0
  4. 补码负数范围比正数多一个最负的数

定点数

定点小数(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 浮点数的运算方法

浮点加减法

  1. 对阶:小阶向大阶看齐,小阶尾数右移
  2. 尾数运算:对阶后的尾数进行加/减
  3. 规格化:左规或右规
  4. 舍入:0舍1入
  5. 判溢出:阶码溢出判断

浮点乘除法

阶码相加/减,尾数乘/除,再规格化。

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表示/范围) 简答