mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
19522 字
52 分钟
运算方法与运算器

本文整理计算机中的运算方法与运算器设计。在计算机组成原理中,掌握移位运算、补码加减法与溢出检测、原码一位乘法以及浮点加减法五步法是本章的复习重点。

要想透彻理解本章,可以按一条主线展开:

计算机内部真正擅长的是加法、移位与逻辑运算。 减法可以转化为加法,乘法可以转化为“加法与移位”,除法可以转化为“减法与移位”,浮点运算则是在定点运算的基础上增加了阶码处理。


第3章:运算方法与运算器#


3.1 计算机中的运算#

计算机中的基本运算可分为位运算、逻辑运算、加减法的逻辑实现、定点除法运算以及浮点乘除法。

3.1.1 C 语言中的位运算#

位运算是对二进制数的每一位分别进行操作。位运算属于低权重考点,但它是构建复杂逻辑的基础。

常见位运算如下:

运算名称运算符号运算规则与作用
按位与&两位都为 1 时结果才为 1,否则为 0
按位或|两位中有一位为 1 时结果就为 1,否则为 0
按位非~逐位取反,0 变 1,1 变 0
按位异或^两位不同为 1,相同为 0

按位异或运算在计算机硬件设计中很重要,因为它常用于判断两位是否不同,也常用于加法器中的求和位计算以及溢出检测电路。

3.1.2 C 语言中的逻辑运算#

逻辑运算处理的是真与假,运算对象是整体逻辑值,结果通常只有 0 或 1。

常见逻辑运算如下:

运算名称运算符号运算规则
逻辑与&&两个条件都为真时结果才为真
逻辑或||两个条件中有一个为真时结果就为真
逻辑非!条件为真时结果为假,条件为假时结果为真
位运算与逻辑运算的区别
  • 位运算:逐位操作,结果仍然是多位的二进制数。
  • 逻辑运算:判断整体真假,结果通常是 0 或 1。

例如,计算 5 & 35 && 3

  • 5 & 3 对应的二进制运算为 0101 & 0011 = 0001,结果是数值 1。
  • 5 && 3 中,因为 5 和 3 都是非零值,在逻辑上均判定为真,所以逻辑与的结果也是 1。虽然二者数值结果碰巧相同,但其物理含义和运算机制完全不同。

3.1.3 C 语言中的算术运算#

在 C 语言中,算术运算在编译为机器指令后,都是在固定的字长内由定点或浮点运算器执行的。在实际编程与考试选择题中,需要特别注意以下机制:

  • 隐式类型转换:当无符号数与带符号数混合运算或进行比较时,C 语言会自动将带符号数隐式转换为无符号数。这常常导致反直觉的结果。例如,表达式 -1 < 1U 的计算结果为假。因为 -1 被转换为无符号数时,其补码 1111...1111 会被解释为无符号数中的最大值 23212^{32}-1,显然大于 1
  • 溢出表现
    • 对于无符号数,运算溢出在 C 语言中是定义良好的,采用模运算处理,超出最高位的部分直接丢弃(如 8 位无符号数 255+1=0255 + 1 = 0)。
    • 对于带符号数,有符号数的溢出在 C 语言标准中属于未定义行为,但在现代计算机硬件中,它同样是通过补码加法器直接相加并截断最高位,可能导致正数相加变成负数的现象。

3.1.4 定点除法运算概览#

定点除法在硬件上比乘法更为复杂,主要采用以下方式:

  • 原码一位除法:符号单独处理(商符号为 zf=xfyfzf = xf \oplus yf),数值部分按照绝对值相除。主要有两种递推算法:
    • 恢复余数法:先尝试用余数减去除数。如果减完后结果为正,说明够减,商上 1;如果结果为负,说明不够减,商上 0,并执行加法操作将除数加回以恢复余数。
    • 不恢复余数法:又称加减交替法。如果上一步减完后余数为负,不立即加回除数,而是将余数左移一位后直接加上除数;若余数为正,则左移一位后减去除数。该方法减少了恢复余数的操作次数,但如果最终余数为负,仍需在末尾加除数进行一次修正。
  • 阵列除法器:一种用于提高除法运算速度的并行硬件结构,其基本构成组件是 CAS单元(即可控加减单元)。CAS 单元除了能够进行一位的全加运算外,还能通过一个控制输入来决定是执行加法还是减法。阵列除法器将大量的 CAS 单元排成多行阵列,每一行代表一次“试减”与“求余”的步骤,通过硬件连线自动将上一行的余数传递给下一行,实现了并行的加减交替运算。

3.1.5 浮点乘除法概览#

浮点数的乘除法不需要对阶,运算直接对阶码和尾数进行处理:

  • 浮点乘法:阶码相加,尾数相乘,确定符号,然后进行规格化、舍入和溢出判断。
  • 浮点除法:阶码相减,尾数相除,确定符号,然后进行规格化、舍入和溢出判断。

3.2 运算器硬件基础#

运算器是中央处理器中负责数据加工的核心部件,主要由算术逻辑单元、累加寄存器、状态寄存器以及通用寄存器组成。

3.2.1 加减法的逻辑实现#

半加器#

半加器用于计算两个一位二进制数相加,不考虑来自低位的进位。

  • 输入:被加数 AA,加数 BB
  • 输出:本位和 SS,向高位的进位 CC

逻辑表达式为:

S=ABS = A \oplus BC=ABC = AB

全加器#

全加器可以处理三个输入,能够将低位传来的进位一并进行计算。

  • 输入:被加数当前位 AA,加数当前位 BB,低位进位 CinCin
  • 输出:本位和 SS,向高位的进位 CoutCout

逻辑表达式为:

S=ABCinS = A \oplus B \oplus CinCout=AB+(AB)CinCout = AB + (A \oplus B)Cin

串行进位加法器#

将多个全加器串联起来即可构成多位加法器。低位的进位输出 CoutCout 直接作为高一位的进位输入 CinCin。这种结构简单,但由于高位的计算必须等待低位进位信号逐级传递,导致整体运算速度较慢。

快速进位加法器#

为了提高运算速度,硬件设计中引入了超前自动进位计算。对于一位加法,定义:

  • 进位产生函数:Gi=AiBiG_i = A_i B_i
  • 进位传递函数:Pi=AiBiP_i = A_i \oplus B_i

则进位输出公式可表示为:

Ci+1=Gi+PiCiC_{i+1} = G_i + P_i C_i

通过展开该递推公式,可以直接由原始输入并行计算出各高位的进位值,从而消除串行进位的等待时间。

3.2.2 运算器的硬件组成#

  • ALU:即算术逻辑单元,是运算器的核心实体,负责执行所有的算术运算、逻辑运算与移位操作。
  • FPU:即浮点运算器,专门用于处理浮点数运算。其硬件内部包含阶码比较电路、对阶移位器、尾数加减器、规格化移位器以及舍入电路。
  • 标志寄存器:用于存放 ALU 运算后的状态标志。

3.2.3 核心标志位#

运算器在完成计算后,会根据结果的状态设置标志寄存器中的标志位。

标志位名称英文简称物理含义适用场景
零标志ZF运算结果是否为 0。若结果为 0 则 ZF = 1无符号数与有符号数
符号标志SF运算结果的符号。若结果为负则 SF = 1有符号数
进位标志CF最高位是否产生进位或借位无符号数
溢出标志OF运算结果是否超出有符号数的表示范围有符号数
CF 与 OF 的应用区别
  • CF 仅对无符号数运算有意义。例如,8 位无符号数 255 + 1 产生进位,此时 CF = 1 且结果为 0,属于正常进位。
  • OF 仅对有符号补码运算有意义。例如,8 位有符号数 127 + 1 结果为 -128,此时 OF = 1,表示发生了溢出,计算结果发生错误。

3.2.4 运算器数据通路结构#

运算器内部通常采用总线结构将各部件连接起来,以下展示了一个定点运算器的典型数据通路架构:

flowchart BT subgraph 寄存器组 R[通用寄存器] ACC[累加寄存器] end subgraph 数据输入 MUX[多路选择器] TEMP[暂存器] end subgraph 核心算术逻辑 ALU[算术逻辑单元] end subgraph 状态监测 PSW[状态字寄存器] end R --> MUX ACC --> MUX MUX --> TEMP TEMP --> ALU ALU --> ACC ALU --> PSW

3.3 定点加减法运算与核心例题#

本节详细梳理高权重核心考点,包含移位运算、补码加减法、溢出检测、定点乘法以及浮点加减法。

补充:C 语言中的移位运算#

移位运算是将二进制数整体向左或向右移动若干位。

移位规则#

  • 逻辑左移:高位移出,低位补 0。
  • 逻辑右移:低位移出,高位补 0。
  • 算术右移:低位移出,高位补符号位(即正数补 0,负数补 1)。

移位与乘除法的数学关系#

在不发生截断和溢出的前提下,移位运算等价于乘以或除以 2 的幂:

  • 左移 kk 位: xkx×2kx \ll k \approx x \times 2^k
  • 右移 kk 位: xkx/2kx \gg k \approx x / 2^k

我们可以利用移位来优化乘除法。例如,计算 x×10x \times 10 可拆解为:

x×10=x×8+x×2=(x3)+(x1)x \times 10 = x \times 8 + x \times 2 = (x \ll 3) + (x \ll 1)
移位大题步骤与真值解释

做移位题时,必须按照以下步骤操作:

  1. 明确机器字长。
  2. 确定是逻辑移位还是算术移位。
  3. 按照规则补位。
  4. 根据无符号数或补码解释最终结果。同一串二进制,按无符号数和补码解释的真值完全不同。

应用例题:移位运算下的数值转换#

例题 1:已知 8 位二进制数 x=1111 0100x = 1111\ 0100,求其分别在逻辑右移 1 位与算术右移 1 位后的结果,并解释其真值变化。

解析

  1. 逻辑右移 1 位
    • 不管原数符号,高位补 0,低位丢弃:0111 10100111\ 1010
    • xx 原本按无符号数解释,真值为 244244;右移后为 0111 10100111\ 1010,真值为 122122。满足: 244/2=122244 / 2 = 122
  2. 算术右移 1 位
    • 考虑符号位,原数最高位为 1,故高位补 1,低位丢弃:1111 10101111\ 1010
    • xx 原本按补码解释,其真值为 12-12;右移后为 1111 10101111\ 1010,其补码真值为 6-6。满足: 12/2=6-12 / 2 = -6

3.3.1 补码加减法运算方法#

计算机中整数的加减法统一采用补码进行运算。

补码表示范围#

对于 nn 位补码整数,其能表示的数值范围是:

2n1x2n11-2^{n-1} \le x \le 2^{n-1} - 1

负数补码求法#

正数补码是其本身。负数补码的求解步骤为:写出对应正数的二进制形式,按位取反,末位加 1。

补码加减法规则#

  • 加法[x+y]=[x]+[y][x + y]_\text{补} = [x]_\text{补} + [y]_\text{补}
  • 减法[xy]=[x]+[y]=[x]+[y]+1[x - y]_\text{补} = [x]_\text{补} + [-y]_\text{补} = [x]_\text{补} + \sim [y]_\text{补} + 1

可控加减法器硬件实现#

在硬件中,利用异或门的控制特性,使用同一个加法器同时实现加法与减法:

  • 设置加减控制信号 SubSub
  • 输入操作数 YYSubSub 进行异或操作得到 YY',同时将 SubSub 接到加法器的最低位进位输入 CinCin
  • Sub=0Sub = 0 时,执行加法:Y=Y0=YY' = Y \oplus 0 = YCin=0Cin = 0,实现 X+YX + Y
  • Sub=1Sub = 1 时,执行减法:Y=Y1=YY' = Y \oplus 1 = \sim YCin=1Cin = 1,实现 X+Y+1=XYX + \sim Y + 1 = X - Y

应用例题:补码加减运算#

例题 2:使用 8 位补码计算 234523 - 45,并给出真值结果。

解析

  1. 确定机器字长为 8 位。
  2. 求出操作数的补码:
    • [23]=0001 0111[23]_\text{补} = 0001\ 0111
    • [45]=0010 1101[45]_\text{补} = 0010\ 1101
  3. 减法转换成加法:2345=23+(45)23 - 45 = 23 + (-45)。求得 [45]=0010 1101+1=1101 0010+1=1101 0011[-45]_\text{补} = \sim 0010\ 1101 + 1 = 1101\ 0010 + 1 = 1101\ 0011
  4. 二进制相加: 0001 0111+1101 00111110 1010\begin{array}{r} 0001\ 0111 \\ + 1101\ 0011 \\ \hline 1110\ 1010 \end{array}
  5. 结果最高位为 1,说明是负数。转换为真值:对 1110 10101110\ 1010 取反得 0001 01010001\ 0101,加 1 得 0001 01100001\ 0110(即真值 22)。因此,最终真值为 22-22,计算未溢出。

3.3.2 溢出及检测#

溢出是指真实的数学运算结果超出了机器字长所能表示的范围。进位与溢出是不同的概念,有进位不一定溢出,无进位也不一定不溢出。

方法一:符号法(单符号位法)#

  • 规律:只有当两个同号的数相加(或异号的数相减)时才可能发生溢出。
  • 正溢出:正数 + 正数 = 负数。
  • 负溢出:负数 + 负数 = 正数。

方法二:进位法#

设最高数值位向符号位的进位为 CdCd,符号位向更高位的进位为 CfCf。溢出标志 VV 的逻辑表达式为:

V=CdCfV = Cd \oplus Cf
  • V=0V = 0,表示无溢出。
  • V=1V = 1,表示发生溢出。

方法三:双符号位法(变形补码)#

使用两位来表示符号:00 表示正数,11 表示负数。 双符号位参与运算后,结果的符号位若为:

  • 00:结果为正,无溢出。
  • 11:结果为负,无溢出。
  • 01:正溢出。
  • 10:负溢出。

3.4 定点乘法运算#

3.4.1 原码一位乘法#

原码一位乘法的基本思想是:符号位单独处理,数值部分取绝对值进行无符号数乘法累加与移位。

  • 结果符号: zf=xfyfzf = xf \oplus yf
  • 数值部分运算步骤: 使用部分积寄存器 AA(初始为 0),被乘数寄存器 BB(存被乘数绝对值)和乘数寄存器 CC(存乘数绝对值)。
    1. 检查乘数最低位 C0C_0
    2. C0=1C_0 = 1,则部分积 A=A+BA = A + B;若 C0=0C_0 = 0,则 A=A+0A = A + 0
    3. 部分积 AA 与乘数 CC 整体联合右移一位(逻辑右移,高位补 0)。
    4. 重复上述操作 nn 次(nn 为数值位位数)。
    5. 拼接 AACC 得到乘积的数值部分,并加上前一步计算出的符号位。

应用例题:原码一位乘法递推#

例题 3:已知 X=+0.1101X = +0.1101Y=0.1011Y = -0.1011,用原码一位乘法计算 X×YX \times Y

解析

  1. 确定符号:zf=01=1zf = 0 \oplus 1 = 1,结果为负。
  2. 取绝对值:被乘数 B=0.1101B = 0.1101,乘数 C=0.1011C = 0.1011。设置部分积初始值 A=00.0000A = 00.0000
  3. 递推计算过程如下表所示:
步骤运算说明部分积 A乘数 C乘数最低位 C0C_0
初始初始状态00.000000.0000101110111
第 1 步A=A+BA = A + B00.110100.110110111011
联合右移 1 位00.011000.0110110111011
第 2 步A=A+BA = A + B01.001101.001111011101
联合右移 1 位00.100100.1001111011100
第 3 步A=A+0A = A + 000.100100.100111101110
联合右移 1 位00.010000.0100111111111
第 4 步A=A+BA = A + B01.000101.000111111111
联合右移 1 位00.100000.100011111111
  1. 拼接部分积 AA 与乘数 CC 的高位部分,得到乘积的数值部分为 0.100011110.10001111
  2. 加上符号位,最终结果为 0.10001111-0.10001111,对应的原码表示为 1.100011111.10001111

3.4.2 补码一位乘法#

补码一位乘法通常采用 Booth 算法,其最大优势在于符号位可以直接参与运算,且能够直接处理补码形式的输入。

Booth 算法运算规则#

设被乘数 [X][X]_\text{补},乘数 [Y]=yf.y1y2yn[Y]_\text{补} = y_f.y_1y_2\dots y_n

  1. 引入一个附加位 yn+1y_{n+1},初始值设为 0。
  2. 每一轮操作根据乘数相邻的两位 ynyn+1y_n y_{n+1} 的值决定对部分积的操作:
yny_nyn+1y_{n+1}对部分积的操作
00部分积保持不变
01部分积加上被乘数补码:A=A+[X]A = A + [X]_\text{补}
10部分积减去被乘数补码(即加上相反数补码):A=A+[X]A = A + [-X]_\text{补}
11部分积保持不变
  1. 每次加减操作后,部分积 AA 与乘数 CC 整体联合右移一位。注意:由于是补码运算,移位采用算术右移,即高位补部分积自身的符号位。
  2. 重复上述“加减 + 右移”操作 nn 次。
  3. n+1n+1 步(最后一步):只根据 yfy1y_f y_1(此时的最低两位)进行加减判定并操作,但不再进行右移。此时得到的拼接结果即为最终的乘积补码 [X×Y][X \times Y]_\text{补}

应用例题:补码一位乘法(Booth 算法)#

例题 4:已知 [X]=110011[X]_\text{补} = 110011,真值为 13-13[Y]=01011[Y]_\text{补} = 01011,真值为 +11+11,即数值位 n=4n=4,用 Booth 算法计算 [X×Y][X \times Y]_\text{补}

解析

  1. 被乘数 [X]=110011[X]_\text{补} = 110011,则 [X]=001101[-X]_\text{补} = 001101
  2. 乘数 [Y]=01011[Y]_\text{补} = 01011,引入附加位 y5=0y_5 = 0,初始乘数寄存器状态为 Y=01011Y = 01011(含符号位),附加位为 00。部分积 A=000000A = 000000
  3. 递推运算过程如下表所示:
步骤判断位对部分积 A 的操作运算后部分积 A乘数 Y 与附加位
初始-初始状态00000000000001011 001011\ 0
第 1 步1 01\ 0A=A+[X]A = A + [-X]_\text{补}00110100110101011 001011\ 0
联合右移 1 位00011000011010101 110101\ 1
第 2 步1 11\ 1A=A+0A = A + 000011000011010101 110101\ 1
联合右移 1 位00001100001101010 101010\ 1
第 3 步0 10\ 1A=A+[X]A = A + [X]_\text{补}11011011011001010 101010\ 1
联合右移 1 位11101111101100101 000101\ 0
第 4 步1 01\ 0A=A+[X]A = A + [-X]_\text{补}00100000100000101 000101\ 0
联合右移 1 位00010000010000010 100010\ 1
第 5 步0 10\ 1仅加减不右移:A=A+[X]A = A + [X]_\text{补}11011111011100010 100010\ 1
  1. 拼接部分积 AA 与乘数 YY 的高 4 位,得到乘积的补码为: [X×Y]=1101110001[X \times Y]_\text{补} = 1101110001
  2. 验证结果:乘积真值为 13×11=143-13 \times 11 = -143+143+143 的 10 位二进制为 001000111120010001111_2,取反加 1 得到补码 110111000121101110001_2,计算无误。

3.4.3 阵列乘法器与补码阵列乘法器#

定点乘法的硬件实现通常从小规模的循环结构(移位加法)向大规模的并行结构演进:

  • 阵列乘法器:一种纯并行的乘法硬件。它通过与门一次性产生所有的位积项(如 aibja_i b_j),然后利用全加器排成的二维阵列,按照权位对齐进行并行累加求和。它的优点是速度极快,但硬件规模随着字长的平方增长。
  • 补码阵列乘法器:专门用来计算补码的阵列乘法器。有两种设计思路:
    1. 间接法:在输入端加上求补级,将补码输入转化为绝对值无符号数,送入普通的无符号阵列乘法器计算,最后在输出端根据输入符号决定是否再次求补。
    2. 直接法:利用直接补码乘法公式(如 Pezaris 阵列乘法器),通过在全加器阵列的某些特定节点使用带负权重的求和单元,直接完成补码的乘积。

3.5 浮点运算#

浮点数的加减运算不能直接对尾数相加减,必须遵循标准的五步法则。

3.5.1 浮点加减法运算#

步骤一:对阶 → 步骤二:尾数加减 → 步骤三:规格化 → 步骤四:舍入 → 步骤五:溢出检测
  1. 对阶:计算阶差 ΔE=ExEy\Delta E = Ex - Ey对阶原则是小阶向大阶看齐。将阶码小的数尾数右移 ΔE\Delta E 位,阶码增加 ΔE\Delta E
  2. 尾数加减:对阶后的两个尾数按照定点补码加减法规则进行求和或求差。
  3. 规格化
    • 右规:尾数求和溢出时,尾数右移一位,阶码加 1。
    • 左规:尾数最高有效位不是规格化数时,尾数连续左移,阶码相应减少,直到规格化为止。补码双符号位规格化形式为 00.1xxx11.0xxx
  4. 舍入:尾数右移丢失低位时需进行精度处理。常用方法有 0舍1入法末位恒置 1 法
  5. 溢出检测:通过阶码判断。若规格化或舍入后阶码超出了最大表示范围,则判定为上溢(报错);若低于最小表示范围,则为下溢(结果按机器 0 处理)。

应用例题:浮点加减法运算#

例题 5:设浮点数格式中阶码为 4 位补码,尾数(含双符号位)为 8 位补码。已知 X=0.1101×24X = 0.1101 \times 2^4Y=0.1011×22Y = 0.1011 \times 2^2,求 X+YX + Y(尾数保留 4 位有效位)。

解析

  1. 对阶
    • 阶码:Ex=4Ex = 4(二进制表示为 01000100),Ey=2Ey = 2(二进制表示为 00100010)。
    • 阶差:ΔE=42=2\Delta E = 4 - 2 = 2
    • YY 的阶码小,尾数右移 2 位,阶码加 2:Y=0.001011×24Y = 0.001011 \times 2^4
  2. 尾数加减
    • 补码对齐相加: 00.110100+00.00101100.111111\begin{array}{r} 00.110100 \\ + 00.001011 \\ \hline 00.111111 \end{array}
    • 得到中间结果:00.111111×2400.111111 \times 2^4
  3. 规格化
    • 尾数符号位与最高数值位为 00.1,已是规格化数,无需左规或右规。
  4. 舍入(保留 4 位有效位,即保留小数点后 4 位):
    • 尾数部分为 00.11111100.111111。保留四位后,被丢弃部分为最高位是 1 的 11
    • 采用 0舍1入法,尾数最低有效位加 1: 00.1111+0.0001=01.000000.1111 + 0.0001 = 01.0000
    • 舍入后尾数溢出,需进行右规:尾数右移一位,阶码加 1。
    • 右规后尾数变为 00.100000.1000,阶码由 4 变为 5(二进制表示为 01010101)。
  5. 溢出检测
    • 阶码 5 在 4 位补码表示范围 [8,+7][-8, +7] 内,未发生溢出。
    • 最终结果为 0.1000×250.1000 \times 2^5

3.6 历年真题与易错点提示#

3.7.1 易错陷阱与考点警示#

在复习和应对考试时,需要特别警惕以下高频考点和易错陷阱:

对阶原则与精度损失

浮点加减法对阶时必须“小阶向大阶看齐”。若大阶向小阶看齐,需要将尾数左移,这会导致尾数高位有效数字丢失,造成严重的计算错误。小阶向大阶看齐只需右移尾数,虽然会丢弃低位,但可以通过舍入控制精度损失。

溢出与进位的概念区分

进位是无符号数在最高位运算时产生溢出范围的进位输出(CF 标志),而溢出是有符号数运算结果超出了有符号表示范围(OF 标志)。在有符号数加法中,最高位产生进位不等于溢出。务必牢记溢出判定公式:

V=CdCfV = Cd \oplus Cf
负数算术右移补位

算术右移为了保持数值的符号,空出的高位必须用符号位填充。对于负数,高位应补 1。切勿习惯性补 0,否则会将负数错误地转换为正数。

变形补码在硬件中的实质

双符号位法在存储器中存储时,为了节省空间,通常只存储单个符号位。双符号位是在数据进入 ALU 准备运算时由硬件临时复制产生的,运算结束后再次检测并转回单符号位存入目标寄存器。


3.7.2 历年真题汇编与详解#

本节汇总了历年期末考试中关于第三章的全部真题,并附带详细解析。

Q1 (期末真题 选择题)#

题干:某机字长 16 位,采用补码形式,其中 1 位为符号位,则机器数所能表示的定点整数范围是( )。

A. -127 ~ +127 B. -128 ~ +128 C. -32768 ~ +32767 D. -32768 ~ +32768

答案:C

解析

  • A [错误]127+127-127 \sim +127 是 8 位有符号原码或反码表示的整数范围。
  • B [错误]128+128-128 \sim +128 中负数部分为 8 位补码范围的下限,而正数 +128+128 超出了 8 位有符号数的表示范围。
  • C [正确]:字长 16 位的补码表示中,1 位为符号位,剩余 15 位为数值位。定点整数的表示范围为 2152151-2^{15} \sim 2^{15}-1,即 32768+32767-32768 \sim +32767
  • D [错误]:正数最大只能表示到 +32767+32767,无法表示 +32768+32768

Q2 (期末真题 选择题)#

题干:补码定点整数 01010100 算术右移两位后的值为( )。

A. 00010101 B. 00010100 C. 11010101 D. 11010100

答案:A

解析

  • A [正确]:补码算术右移的规则是符号位保持不变,左侧空出位用符号位填充,右侧溢出位丢弃。已知补码为 0101010001010100,符号位为 0,右移两位后在左侧补两个 0,丢弃右侧的两位 00,结果为 0001010100010101
  • B [错误]:右移后数值位计算错误,低位丢弃后不应为 00。
  • C [错误]:左侧补 1 是负数补码算术右移的规则,本题操作数符号位为 0,是正数。
  • D [错误]:左侧填充和数值计算均错误。

Q3 (2019秋18级测试 选择题)#

题干:以下有关运算器的描述中,( )是正确的。

A. 只做加法运算 B. 只做算术运算 C. 算术运算与逻辑运算 D. 只做逻辑运算

答案:C

解析

  • A [错误]:运算器不仅可以执行加法,还可以通过移位和求反配合加法器执行减法、乘法、除法等算术运算,也能进行逻辑运算。
  • B [错误]:运算器除了能执行算术运算外,还可以执行与、或、非、异或等逻辑运算。
  • C [正确]:运算器是计算机中执行各种算术运算和逻辑运算的部件。
  • D [错误]:运算器除了能执行逻辑运算外,还可以执行各类算术运算。

Q4 (2019秋18级测试 选择题)#

题干:若浮点数用补码表示,则判断运算结果是否为规格化数的方法是( )。

A. 阶符与数符相同为规格化数 B. 阶符与数符相异为规格化数 C. 数符与尾数小数点后第一位数字相异为规格化数 D. 数符与尾数小数点后第一位数字相同为规格化数

答案:C

解析

  • A [错误]:规格化判断仅与尾数的数符及尾数的第一位数值有关,与阶符无关。
  • B [错误]:规格化判断与阶符无关。
  • C [正确]:补码规格化尾数的特点是:正数规格化形式为 0.10.1\dots,负数规格化形式为 1.01.0\dots。可见,数符与尾数第一位数值相异,即一个是 0 一个是 1。
  • D [错误]:数符与尾数第一位数字相同时,正数为 0.00.0\dots,负数为 1.11.1\dots,这属于未规格化的形式。

Q5 (南阳理工C卷 选择题)#

题干:双符号位补码运算中,结果符号位为 10 表示( )。

A. 正溢出 B. 负溢出 C. 正常结果 D. 无溢出

答案:B

解析

  • A [错误]:双符号位为 01 时表示发生了正溢出。
  • B [正确]:在变形补码运算中,双符号位 Sf1Sf2S_{f1} S_{f2} 分别表示:00 表示结果为正且无溢出,11 表示结果为负且无溢出,01 表示正溢出,10 表示负溢出。
  • C [错误]:双符号位不同,即 10 或 01,代表发生了溢出,不能是正常结果。
  • D [错误]:双符号位不一致说明已经发生溢出。

Q6 (期末真题 选择题)#

题干:算术逻辑单元的核心功能部件是( )。

A. 累加寄存器 B. 移位器 C. 加法器 D. 指令寄存器

答案:C

解析

  • A [错误]:累加寄存器属于运算器中的数据暂存部件,主要用来保存操作数或运算结果,并非 ALU 的核心计算功能部件。
  • B [错误]:移位器用于数据移位,但在 ALU 中,各种算术运算最终都是基于加法器实现的。
  • C [正确]:加法器是 ALU 的核心部件,其他算术运算(如减法、乘法、除法)均可通过加法与移位等操作的组合来实现。
  • D [错误]:指令寄存器是控制器的部件,用于存放当前正在执行的指令,不属于 ALU。

Q7 (期末真题 选择题)#

题干:在定点运算器中,无论是采用双符号位还是采用单符号位,必须有( )。

A. 译码电路,它一般用与非门来实现 B. 编码电路,它一般用或非门来实现 C. 溢出判断电路,它一般用异或门来实现 D. 移位电路,它一般用与或非门来实现

答案:C

解析

  • A [错误]:译码电路用于对指令或地址进行译码,与单双符号位溢出判断没有直接联系。
  • B [错误]:编码电路用于状态或数据的编码,非溢出判断的核心组件。
  • C [正确]:在单符号位加减运算中,溢出判断通常基于最高数值位进位与符号位进位是否相异,即采用异或逻辑;在双符号位中,基于两个符号位是否相异,同样采用异或逻辑。因此,溢出判断电路是必需的,且一般用异或门来实现。
  • D [错误]:移位电路用于数据的移位,与单双符号位溢出判断无直接依赖关系。

Q8 (期末真题 选择题)#

题干:在定点机中执行算术运算时会产生溢出,其根本原因是( )。

A. 主存容量不够 B. 运算结果无法表示 C. 操作数地址过大 D. 栈溢出

答案:B

解析

  • A [错误]:主存容量限制的是程序和数据的存储空间,与算术运算是否溢出无关。
  • B [正确]:溢出的根本原因在于运算结果超出了机器字长所能表示的数值范围,即当前的运算结果无法在定点机中表示。
  • C [错误]:操作数地址过大会导致寻址错误或越界异常,与算术运算发生溢出无关。
  • D [错误]:栈溢出是指程序运行时的调用栈空间耗尽,与算术运算中的数值溢出是完全不同的概念。

Q9 (期末真题 选择题)#

题干:在原码加减交替除法中,符号位单独处理,参加操作的数是( )。

A. 原码 B. 绝对值 C. 绝对值的补码 D. 补码

答案:C

解析

  • A [错误]:原码直接参与除法中的加减运算在硬件中不便实现,且减法需要转换为加法。
  • B [错误]:绝对值是正数真值,但硬件上减去一个绝对值需要用其补码的形式来进行加法。
  • C [正确]:原码加减交替除法符号位与数值位分开处理。在计算商值时,数值部分做绝对值除法。为了在硬件中将减法操作统一为加法操作,减去商或除数时需要将除数绝对值求补,故实际参加加法器操作的数是绝对值的补码。
  • D [错误]:采用整机补码时符号位会直接参与运算,而原码除法要求符号位单独处理。

Q10 (期末真题 选择题)#

题干:加法器采用先行进位的目的是( )。

A. 优化加法器的结构 B. 节省器材 C. 加速传递进位信号 D. 增强加法器结构

答案:C

解析

  • A [错误]:先行进位会使加法器的电路结构变得更加复杂,没有简化或优化结构。
  • B [错误]:先行进位需要引入额外的超前进位产生逻辑,增加了逻辑门元件,消耗了更多器材。
  • C [正确]:在普通行波进位加法器中,高位的加法必须等待低位的进位信号依次传过来,导致速度受限。先行进位通过硬件逻辑直接算出各高位的进位输入,从而极大地加速了进位信号的传递,提高了运算速度。
  • D [错误]:所谓增强结构表达含糊,实际硬件设计的直接指标是速度提升。

Q11 (期末真题 选择题)#

题干:考虑以下 C 语言代码:

unsigned short usi = 65535;
short si = usi;

执行上述程序段后,si 的值是( )。

A. -1 B. -32767 C. -32768 D. -65535

答案:A

解析

  • A [正确]:16位无符号数 usi = 65535 的二进制表示为 1111 1111 1111 111121111\ 1111\ 1111\ 1111_2(全 1)。当它强制转换为有符号 short 类型变量 si 时,二进制序列保持不变。在有符号 16 位补码中,全 1 序列的真值对应为 1-1
  • B [错误]32767-32767 的二进制补码为 1000 0000 0000 000121000\ 0000\ 0000\ 0001_2
  • C [错误]32768-32768 的二进制补码为 1000 0000 0000 000021000\ 0000\ 0000\ 0000_2
  • D [错误]:16 位有符号 short 类型的表示范围为 3276832767-32768 \sim 32767,根本无法表示 65535-65535

Q12 (期末真题 选择题)#

题干:假定一个十进制数为 -66,按补码形式存放在一个 8 位寄存器中,该寄存器的内容用十六进制表示为( )。

A. C2H B. BEH C. BDH D. 42H

答案:B

解析

  • A [错误]:十六进制 C2H\text{C2H} 对应的二进制为 1100 001021100\ 0010_2,表示的真值为 62-62
  • B [正确]:十进制数 6666 的二进制无符号表示为 0100 001020100\ 0010_2。对于负数 66-66,求其 8 位补码应为绝对值按位取反加 1,即对 0100 001020100\ 0010_2 取反得到 1011 110121011\ 1101_2,再加 1 得到 1011 111021011\ 1110_2。转换为十六进制,高 4 位为 B,低 4 位为 E,即 BEH\text{BEH}
  • C [错误]:十六进制 BDH\text{BDH} 对应的二进制为 1011 110121011\ 1101_2,是 66-66 补码求取过程中取反未加 1 的中间结果,即反码表示。
  • D [错误]:十六进制 42H\text{42H} 对应的二进制为 0100 001020100\ 0010_2,表示的真值为 +66+66

填空与判断题#

Q13 (2019秋18级测试 填空题)#

题干:在机器码 ________ 和 ________ 中,零的编码是唯一的。

解析

原码和反码中的 0 均有正 0 和负 0 两种不同的编码。补码和移码中 0 的编码是唯一的。

答案:补码、移码。

Q14 (2019秋18级测试 填空题)#

题干:浮点加、减运算的步骤是 、规格化、舍入、溢出判断。

解析

浮点加减法五步法为:对阶、尾数求和、规格化、舍入、溢出判断。

答案:对阶、尾数求和。

Q15 (2022-2023学年 填空题)#

题干:原码乘法时,符号位单独处理,乘积的符号位是由两个操作数符号进行 ________ 运算得到的。

解析

原码乘法的符号计算规则是同号相乘为正,异号相乘为负,在逻辑电路上通过对两个符号位进行异或运算实现。

答案:异或。

Q16 (2019秋18级测试 填空题)#

题干:算术逻辑单元的功能包括算术运算和 ________ 运算。

解析

ALU 即算术逻辑单元,提供算术运算和逻辑运算两大类基本运算。

答案:逻辑。

Q17 (期末真题 填空题)#

题干:CPU 主要由运算器、________ 和 ________ 组成。(或:CPU 主要由运算器和 ________ 组成。)

解析

现代 CPU 内部集成了运算器、控制器以及高速缓冲存储器 Cache。

答案:控制器、Cache(或:控制器)。

Q18 (期末真题 填空题)#

题干:补码定点整数 01010101 左移两位后的值为 ________。

解析

补码定点数左移规则为高位丢弃,低位补 0。01010101 左移两位后变为 01010100。

答案:01010100。

Q19 (期末真题 填空题)#

题干:8 位原码能表示的不同数据有 ________ 个。

解析

8 位二进制编码共有 256 个。在原码中,正零 0000000000000000 与负零 1000000010000000 对应同一个数学真值 0。因此,所能表示的不同数据个数为 2561=255256 - 1 = 255 个。

答案:255。

Q20 (2022-2023学年 判断题)#

题干:采用变形补码进行加减运算可以避免溢出。( )

解析

变形补码(双符号位)的作用是简化溢出检测电路,使硬件更容易判断是否发生溢出,但无法阻止或避免溢出的发生。

答案:错。

Q21 (期末真题 判断题)#

题干:溢出判断电路一般用与或非门来实现。( )

解析

溢出判断的逻辑基础是异或,因此硬件电路上一般使用异或门实现。

答案:错。


计算与分析大题#

Q22 (2019秋18级测试 计算题)#

题干:已知有符号数 X=+11012×24X = +1101_2 \times 2^{-4}Y=10012×24Y = -1001_2 \times 2^{-4},用变形补码计算 [X+Y][X+Y]_\text{补},并判断是否发生溢出。

解析

写出 XXYY 的小数形式:X=+0.1101X = +0.1101Y=0.1001Y = -0.1001。 采用变形补码(双符号位)表示:

[X]=00.1101[X]_\text{补} = 00.1101[Y]=11.0111[Y]_\text{补} = 11.0111

变形补码求和计算:

00.1101+11.0111100.0100\begin{array}{r} 00.1101 \\ + 11.0111 \\ \hline 100.0100 \end{array}

最左边的进位 1 丢弃,得到结果补码:

[X+Y]=00.0100[X+Y]_\text{补} = 00.0100

结果的双符号位为 00,表示运算结果为正数,且无溢出。

Q23 (南阳理工C卷 计算题)#

题干:用双符号位补码运算方法计算 x=0.1010x = 0.1010y=0.1100y = 0.1100 的和,并分析溢出状态。

解析

采用双符号位补码表示:

[x]=00.1010[x]_\text{补} = 00.1010[y]=00.1100[y]_\text{补} = 00.1100

两数相加计算:

00.1010+00.110001.0110\begin{array}{r} 00.1010 \\ + 00.1100 \\ \hline 01.0110 \end{array}

得到结果双符号位为 01,符号位不同。由于符号位是 01,表示运算结果发生了正溢出。

Q24 (2020-2021 B卷 计算题)#

题干:已知定点小数 x=0.1000x = 0.1000y=0.0101y = -0.0101,求 [x][x]_\text{补}[y][y]_\text{补}[x+y][x+y]_\text{补},并判断是否发生溢出。

解析

  1. 根据补码定义,正数的补码是其本身,负数的补码为绝对值取反加 1:
[x]=0.1000[x]_\text{补} = 0.1000[y]=1.1011[y]_\text{补} = 1.1011
  1. 补码相加:
0.1000+1.101110.0011\begin{array}{r} 0.1000 \\ + 1.1011 \\ \hline 10.0011 \end{array}

最高位进位 1 丢弃,得到:

[x+y]=0.0011[x+y]_\text{补} = 0.0011
  1. 由于相加的两个操作数一个为正数,一个为负数,异号数相加绝不可能产生溢出。进位丢弃后符号位为 0,结果正确,无溢出。

Q25 (2022-2023学年 计算题)#

题干:已知定点整数 A=10012A = -1001_2B=01012B = -0101_2,求 [A+B][A+B]_\text{补}

解析

设字长为 5 位(含 1 位符号位):

  1. 求出各操作数的补码:
  • A=1001A = -1001,其绝对值正二进制为 0,10010,1001,取反加 1 后补码为:
[A]=1,0111[A]_\text{补} = 1,0111
  • B=0101B = -0101,其绝对值正二进制为 0,01010,0101,取反加 1 后补码为:
[B]=1,1011[B]_\text{补} = 1,1011
  1. 补码相加:
1,0111+1,101111,0010\begin{array}{r} 1,0111 \\ + 1,1011 \\ \hline 11,0010 \end{array}

根据模 24+12^{4+1} 的规则,丢弃最左侧产生的进位 1,得到:

[A+B]=1,0010[A+B]_\text{补} = 1,0010

Q26 (2020-2021 A卷 计算题)#

题干:已知 [X]=1.10010[X]_\text{补} = 1.10010[Y]=1.01110[Y]_\text{原} = 1.01110,求 XXYY 的真值。

解析

  1. [X]=1.10010[X]_\text{补} = 1.10010
  • 符号位为 1,是负数。
  • 求真值绝对值:补码的数值位取反加 1 得到:
10010+1=01101+1=01110\sim 10010 + 1 = 01101 + 1 = 01110
  • 加上符号,其真值为 X=0.011102X = -0.01110_2
  1. [Y]=1.01110[Y]_\text{原} = 1.01110
  • 符号位为 1,是负数,原码数值位即代表绝对值。
  • 其真值为 Y=0.011102Y = -0.01110_2

Q27 (南阳理工C卷 计算题)#

题干:请说明浮点数加减运算中对阶的原则,并以 A=0.1101×23A = 0.1101 \times 2^3B=0.1010×21B = 0.1010 \times 2^1 计算 A+BA+B 的值。

解析

  1. 对阶原则:对阶时必须遵循“小阶向大阶看齐”的原则。即通过右移小阶数的尾数,并相应增加其阶码,使两个数的阶码一致。这样可以确保尾数右移时丢弃的是低位,将精度损失降到最低;若大阶向小阶看齐,会导致尾数左移而丢失高位有效数字,造成严重计算错误。
  2. 加法计算
  • 阶码:Ex=3Ex = 3Ey=1Ey = 1。阶差为 ΔE=31=2\Delta E = 3 - 1 = 2
  • BB 的阶码小,尾数右移两位,阶码加 2:
B=0.001010×23B = 0.001010 \times 2^3
  • 尾数对齐相加:
0.110100+0.0010100.111110\begin{array}{r} 0.110100 \\ + 0.001010 \\ \hline 0.111110 \end{array}
  • 得到结果为 0.111110×230.111110 \times 2^3。尾数符号与最高有效位相异(0.1),已是规格化数,无溢出,故最终结果为 0.11111×230.11111 \times 2^3

习题3:课后习题详解#

以下为本章教材配属的全部课后习题及详细解答。

课后习题1 课后习题2 课后习题3


习题3.1 解释下列名词#

名词详细物理与学术解释
全加器能完成两个本位二进制数和来自低位的进位相加的电路。输入为 AiA_iBiB_iCiC_i,输出为本位和 SiS_i 与向高位的进位 Ci+1C_{i+1}
半加器只能完成两个本位二进制数相加的电路,没有低位进位输入。输入为 AiA_iBiB_i,输出为和 SiS_i 与进位 Ci+1C_{i+1}
进位生成函数表示本位两个操作数本身是否一定产生进位,通常记为 Gi=AiBiG_i = A_i B_i。只要 Ai=Bi=1A_i = B_i = 1,本位必然向高位产生进位。
进位传递函数表示本位是否能把低位进位传递到高位,通常记为 Pi=AiBiP_i = A_i \oplus B_i。当 Pi=1P_i = 1 时,若低位有进位输入,则该进位会继续传到高位。
算术移位针对带符号数的移位。右移时保持符号位不变,左移时低位补 0。算术右移通常相当于带符号数除以 2,算术左移通常相当于乘以 2,但可能溢出。
逻辑移位不考虑符号意义的移位。左移或右移后空出的位一律补 0。常用于无符号数或逻辑数据。
阵列乘法器由大量加法单元和与门按阵列结构连接而成的并行乘法器。它可以同时生成多个部分积,并通过阵列加法网络完成求和,速度快但硬件开销大。
原码恢复余数除法原码除法的一种方法。每次先用部分余数减除数,若结果为负,则说明不够减,商上 0,并把余数恢复为减除数前的值;若结果非负,则商上 1。
原码不恢复余数法原码除法的一种改进方法。若某次减除数后余数为负,不立即恢复,而是在下一步改为加除数。这样减少了恢复操作,提高了速度。
阵列除法用规则排列的加减单元组成阵列结构来实现除法的硬件方法。它类似阵列乘法器,利用并行结构完成部分余数的加减和商位生成。
串行进位也叫行波进位。低位加法器产生的进位依次传到高位,高位必须等待低位进位到达后才能计算,结构简单但速度慢。
先行进位也叫并行进位或超前进位。通过进位生成函数 GiG_i 和进位传递函数 PiP_i 直接计算各位进位,不必逐位等待,因此加法速度快。
对阶浮点数加减前,使两个浮点数的阶码相同的过程。通常将阶码较小的数的尾数右移,使其阶码增大到与另一个数相同。
规格化把浮点运算结果调整为规定尾数形式的过程。对原码尾数,通常要求最高有效位为 1;对补码尾数,正数要求形如 0.10.1\cdots,负数要求形如 1.01.0\cdots
保留附加位在浮点运算过程中,为减少对阶、右移和舍入造成的误差,临时保留尾数低位之外的若干额外位,如保护位、舍入位、粘滞位等。

习题3.2 选择题(考研真题)#

( 1 ) 一个 C 语言程序在一台 32 位机器上运行,程序中定义了 3 个变量 x,y,zx, y, z,其中 xxzzint 型,yyshort 型。当 x=127,y=9x = 127, y = -9 时,执行赋值语句 z=x+yz = x+y 后,x,y,zx, y, z 的值分别是 ______。#

A. x=0000007FHx = \text{0000007FH}, y=FFF9Hy = \text{FFF9H}, z=00000076Hz = \text{00000076H} B. x=0000007FHx = \text{0000007FH}, y=FFF9Hy = \text{FFF9H}, z=FFFF0076Hz = \text{FFFF0076H} C. x=0000007FHx = \text{0000007FH}, y=FFF7Hy = \text{FFF7H}, z=FFFF0076Hz = \text{FFFF0076H} D. x=0000007FHx = \text{0000007FH}, y=FFF7Hy = \text{FFF7H}, z=00000076Hz = \text{00000076H}

答案:D

解析

  • A [错误]yy 值为 9-9,其 16 位补码表示为 FFF7H\text{FFF7H},即对 +9+9 对应的二进制 0009H\text{0009H} 按位取反加 1 得到 FFF7H\text{FFF7H},选项中 y=FFF9Hy = \text{FFF9H} 错误。
  • B [错误]yy 值表示错误;同时,z=x+y=127+(9)=118z = x+y = 127 + (-9) = 118,作为 32 位有符号整数,其十六进制表示应为 00000076H\text{00000076H},选项中 z=FFFF0076Hz = \text{FFFF0076H} 错误。
  • C [错误]zz 值的十六进制表示错误,FFFF0076H\text{FFFF0076H} 不是 118118 的 32 位补码形式。
  • D [正确]xx 为 32 位有符号数,真值 127127 表示为 0000007FH\text{0000007FH}yy 为 16 位有符号数,9-9 表示为 FFF7H\text{FFF7H};执行 z=x+yz = x+y 时,短整型 yy 符号扩展为 32 位(FFFFFFF7H\text{FFFFFFF7H})后再与 xx 相加,计算得到 z=118z = 118,其 32 位补码表示为 00000076H\text{00000076H}

( 2 ) 假定有 4 个整数用 8 位补码分别表示为 r1=FEHr_1 = \text{FEH}r2=F2Hr_2 = \text{F2H}r3=90Hr_3 = \text{90H}r4=F8Hr_4 = \text{F8H},若将运算结果存放在一个 8 位的寄存器中,则下列运算会发生溢出的是 ______。#

A. r1×r2r_1 \times r_2 B. r2×r3r_2 \times r_3 C. r1×r4r_1 \times r_4 D. r2×r4r_2 \times r_4

答案:B

解析

  • A [错误]r1=FEHr_1 = \text{FEH} 的真值为 2-2r2=F2Hr_2 = \text{F2H} 的真值为 14-14。两者相乘得 r1×r2=(2)×(14)=28r_1 \times r_2 = (-2) \times (-14) = 28,在 8 位有符号补码表示的数值范围 [128,127][-128, 127] 内,未发生溢出。
  • B [正确]r2=F2Hr_2 = \text{F2H} 的真值为 14-14r3=90Hr_3 = \text{90H} 的真值为 112-112。两者相乘得 r2×r3=(14)×(112)=1568r_2 \times r_3 = (-14) \times (-112) = 1568,超出了 8 位有符号数表示的最大值 127127,故会发生溢出。
  • C [错误]r1=FEHr_1 = \text{FEH} 的真值为 2-2r4=F8Hr_4 = \text{F8H} 的真值为 8-8。两者相乘得 r1×r4=(2)×(8)=16r_1 \times r_4 = (-2) \times (-8) = 16,在 [128,127][-128, 127] 范围内,未发生溢出。
  • D [错误]r2=F2Hr_2 = \text{F2H} 的真值为 14-14r4=F8Hr_4 = \text{F8H} 的真值为 8-8。两者相乘得 r2×r4=(14)×(8)=112r_2 \times r_4 = (-14) \times (-8) = 112,在 [128,127][-128, 127] 范围内,未发生溢出。

( 3 ) 某字长为 8 位的计算机中,已知整型变量 x,yx, y 的机器数分别为 [x]=11110100[x]_\text{补} = 11110100[y]=10110000[y]_\text{补} = 10110000。若整型变量 z=2x+y/2z = 2x + y/2,则 zz 的机器数为 ______。#

A. 1100000011000000 B. 0010010000100100 C. 1010101010101010 D. 溢出

答案:A

解析

  • A [正确]:已知 [x]=111101002[x]_\text{补} = 11110100_2,其最高位为 1,表示负数,真值 x=12x = -12,则 2x=242x = -24[y]=101100002[y]_\text{补} = 10110000_2,最高位为 1,表示负数,真值 y=80y = -80,则 y/2=40y/2 = -40。代入得 z=2x+y/2=24+(40)=64z = 2x + y/2 = -24 + (-40) = -64。在 8 位有符号整型表示范围 [128,127][-128, 127] 内,计算未发生溢出,64-64 的 8 位补码机器数为 11000000211000000_2
  • B [错误]:机器数 00100100200100100_2 的符号位为 0,代表正数 +36+36,而数学结果应为负数 64-64
  • C [错误]:机器数 10101010210101010_2 的符号位为 1,数值部分取反加 1 得到 01010110201010110_2,代表真值 86-86,与 64-64 不符。
  • D [错误]:由于结果 64-64 在 8 位有符号数的表示范围 [128,127][-128, 127] 内,所以并没有发生溢出。

( 4 ) 假定带符号整数采用补码表示,若 int 型变量 xxyy 的机器数分别是 FFFF FFDFH\text{FFFF FFDFH}0000 0041H\text{0000 0041H},则 x,yx, y 的值以及 xyx - y 的机器数分别是 ______。#

A. x=65,y=41x = -65, y = 41, xyx - y 的机器数溢出 B. x=33,y=65x = -33, y = 65, xyx - y 的机器数为 FFFF FF9DH\text{FFFF FF9DH} C. x=33,y=65x = -33, y = 65, xyx - y 的机器数为 FFFF FF9EH\text{FFFF FF9EH} D. x=65,y=41x = -65, y = 41, xyx - y 的机器数为 FFFF FF96H\text{FFFF FF96H}

答案:C

解析

  • A [错误]x=FFFF FFDFHx = \text{FFFF FFDFH},符号位为 1,其十进制真值为 33-33,并非 65-65。另外,32 位补码运算 3365=98-33 - 65 = -98 在表示范围内,没有发生溢出。
  • B [错误]98-98 的 32 位补码机器数应为 FFFF FF9EH\text{FFFF FF9EH},而 FFFF FF9DH\text{FFFF FF9DH} 对应的十进制真值为 99-99
  • C [正确]x=FFFF FFDFHx = \text{FFFF FFDFH} 的最高位为 1,其十进制真值为 33-33y=0000 0041Hy = \text{0000 0041H} 的最高位为 0,其十进制真值为 6565。计算 xy=3365=98x - y = -33 - 65 = -98+98+98 对应的十六进制为 0000 0062H\text{0000 0062H},对其按位取反加 1 得到 98-98 的 32 位补码机器数为 FFFF FF9EH\text{FFFF FF9EH}
  • D [错误]xx 的真值应为 33-33,而非 65-65yy 的真值应为 6565,而非 4141

( 5 ) 已知 x,yx, yint 型,当 x=100,y=200x = 100, y = 200 时,执行“x 减 y”指令得到的溢出标志 OF 和借位标志 CF 分别为 0、1,那么当 x=10,y=20x = 10, y = -20 时,执行该指令得到的 OF 和 CF 分别是 ______。#

A. OF=0,CF=0\text{OF} = 0, \text{CF} = 0 B. OF=0,CF=1\text{OF} = 0, \text{CF} = 1 C. OF=1,CF=0\text{OF} = 1, \text{CF} = 0 D. OF=1,CF=1\text{OF} = 1, \text{CF} = 1

答案:B

解析

  • A [错误]:在无符号数解释下,被减数 0000 000AH\text{0000 000AH} 小于减数 FFFF FFECH\text{FFFF FFECH},无符号减法运算必须产生借位,故 CF=1\text{CF} = 1
  • B [正确]:当 x=10,y=20x = 10, y = -20 时,数学运算 xy=10(20)=30x - y = 10 - (-20) = 30 未超出 32 位有符号整数的表示范围,故有符号溢出标志 OF=0\text{OF} = 0。进行机器减法时,操作数均以补码表示:x=0000 000AHx = \text{0000 000AH}20-20 的补码 y=FFFF FFECHy = \text{FFFF FFECH}。将它们作为无符号数相减,被减数 xx 小于减数 yy,需要向高位借位,因此无符号借位标志 CF=1\text{CF} = 1
  • C [错误]:因为 xy=30x - y = 30 没有超出有符号整数范围,所以有符号溢出标志 OF\text{OF} 应为 0,且无符号借位标志 CF\text{CF} 应当为 1。
  • D [错误]:此运算并没有发生有符号数溢出,所以有符号溢出标志 OF\text{OF} 应为 0。

( 6 ) 整数 xx 的机器数为 1101 1000,分别对 xx 进行逻辑右移 1 位和算术右移 1 位操作,得到的机器数各是 ______。#

A. 1110 1100、1110 1100 B. 0110 1100、1110 1100 C. 1110 1100、0110 1100 D. 0110 1100、0110 1100

答案:B

解析

  • A [错误]:逻辑右移时,不论原数符号如何,高位一律填 0。因此逻辑右移 1 位后的结果应为 0110 11000110\ 1100,而非 1110 11001110\ 1100
  • B [正确]:对 x=1101 1000x = 1101\ 1000 进行逻辑右移 1 位,最高位填充 0,结果为 0110 11000110\ 1100;进行算术右移 1 位,需保持符号位不变,最高位填充原有最高符号位 1,结果为 1110 11001110\ 1100
  • C [错误]:该选项将逻辑右移与算术右移的结果弄反了。
  • D [错误]:算术右移时,由于原数最高位为 1,高位应填充符号位 1。因此算术右移 1 位后的结果应为 1110 11001110\ 1100,而非 0110 11000110\ 1100

( 7 ) 下列关于整数乘法运算的叙述中,错误的是 ______。#

A. 用阵列乘法器实现乘法运算可以在一个时钟周期内完成 B. 用 ALU 和移位器实现的乘运算无法在一个时钟周期内完成 C. 变量与常数的乘运算可编译优化为若干位移位及加减运算指令 D. 两个变量的乘运算无法编译为移位及加法等指令的循环实现

答案:D

解析

  • A [错误]:此叙述是正确的。阵列乘法器采用纯组合逻辑电路设计,只要控制时钟周期大于其最长路径延迟,就可以在一个时钟周期内完成乘法运算。
  • B [错误]:此叙述是正确的。使用 ALU 和移位器实现乘法时,需要依次执行多次“判断、相加、移位”的多步操作,无法在单个时钟周期内完成。
  • C [错误]:此叙述是正确的。编译器常将变量与常数的乘法运算转换为更高效的移位与加减指令序列进行优化。
  • D [正确]:此叙述是错误的。如果没有提供专用的硬件乘法指令,两个变量相乘完全可以通过逻辑移位、数值位条件判断和累加指令构成的循环结构来实现。

( 8 ) 浮点数加减运算过程一般包括对阶、尾数运算、规格化、舍入和判断溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为 5 位和 7 位(均含 2 位符号位)。若有两个数 X=27×29/32,Y=25×5/8X = 2^7 \times 29/32, Y = 2^5 \times 5/8,则用浮点加法计算 X+YX+Y 的最终结果是 ______。#

A. 001111100010 B. 001110100010 C. 010000010001 D. 发生溢出

答案:D

解析

  • A [错误]:计算过程中,阶码发生上溢。溢出发生时无法以正常的规格化浮点形式输出数值。
  • B [错误]:同上,计算过程中阶码上溢,该选项并非正确计算结果。
  • C [错误]:同上,计算中阶码上溢,结果不可能是此正常浮点编码。
  • D [正确]X=27×(29/32)X = 2^7 \times (29/32),尾数补码为 00.11101200.11101_2,阶码为 00111200111_2Y=25×(5/8)Y = 2^5 \times (5/8),尾数补码为 00.10100200.10100_2,阶码为 00101200101_2。对阶时小阶向大阶看齐,YY 的尾数右移两位变为 00.00101200.00101_2,其阶码增加到 77。尾数进行求和:00.111012+00.001012=01.00010200.11101_2 + 00.00101_2 = 01.00010_2。因尾数溢出,需进行右规:尾数右移一位变为 00.10001200.10001_2,阶码加 1。原阶码 7700111200111_2)加 1 后变为 8801000201000_2)。由于 5 位双符号位阶码最大能表示的有符号整数为 +7+7(即 00111200111_2),因此阶码正溢出,运算结果发生溢出。

( 9 ) 下列有关浮点数加减运算的叙述中,正确的是 ______。#

Ⅰ. 对阶操作不会引起阶码上溢或下溢 Ⅱ. 右规和尾数舍入都可能引起阶码上溢 Ⅲ. 左规时可能引起阶码下溢 Ⅳ. 尾数溢出时结果不一定溢出 A. 仅 Ⅱ、Ⅲ B. 仅 Ⅰ、Ⅱ、Ⅳ C. 仅 Ⅰ、Ⅲ、Ⅳ D. Ⅰ、Ⅱ、Ⅲ、Ⅳ

答案:D

解析

  • A [错误]:此选项只包含了 Ⅱ 和 Ⅲ,遗漏了同样正确的 Ⅰ 和 Ⅳ。
  • B [错误]:此选项遗漏了 Ⅲ。左规时由于尾数左移阶码需要减 1,当阶码减小后超出表示下限时,会发生下溢,故 Ⅲ 正确。
  • C [错误]:此选项遗漏了 Ⅱ。右规与舍入,也就是舍入进位若导致尾数溢出而需要右规,都会导致阶码加 1,进而可能使阶码上溢,故 Ⅱ 正确。
  • D [正确]:分析如下:Ⅰ. 对阶原则为小阶向大阶看齐,只将小阶码增大至原本已合法存在的大阶码,因此不可能发生溢出;Ⅱ. 右规和尾数舍入若导致尾数右移则需将阶码加 1,可能导致阶码超出上限而上溢;Ⅲ. 左规时尾数左移需要将阶码减 1,可能导致阶码低于下限而下溢;Ⅳ. 尾数求和溢出,即双符号位不一致时,可以通过右规并将阶码加 1 进行调整,若阶码未超出上限,则结果不发生溢出。故四项均正确。

习题3.3 简答题#

( 1 ) 为什么采用并行进位能提高加法器的运算速度?#

解答

  • 消除了串行进位链的依赖传递:在串行进位(行波进位)加法器中,高位的运算必须等待低位进位产生并逐级传递过来,形成了严重的串行进位链延迟。
  • 并行进位方程实现直接计算:并行进位加法器定义了进位产生函数 Gi=AiBiG_i = A_i B_i 与进位传递函数 Pi=AiBiP_i = A_i \oplus B_i。直接展开递归方程,如: Ci+1=Gi+PiCiC_{i+1} = G_i + P_i C_i 可以由输入信号一步直接计算出各位的进位输出,各位的进位几乎同时产生,极大提高了加法器的整体速度。

( 2 ) 如何判断浮点数运算结果是否发生溢出?#

解答

  • 主要取决于最终规格化和舍入后的阶码范围:浮点数的溢出主要通过阶码是否超出表示极限来判定,尾数溢出不等于浮点数结果溢出。
  • 阶码上溢判定:若规格化或精度舍入后,最终的阶码超出了表示范围的最大正阶值,即发生阶码上溢,硬件报错并判定为溢出。
  • 阶码下溢判定:若规格化后阶码小于表示范围的最小负阶值,则发生阶码下溢,运算结果通常被作为机器零或者非规格化数处理,不直接报错。

( 3 ) 如何判断浮点数运算结果是否为规格化数?如果不是规格化数,如何进行规格化?#

解答

  • 规格化数的判定
    • 原码尾数:要求尾数的最高有效位必须为 1,即形式为 0.1xxx0.1xxx1.1xxx1.1xxx
    • 补码尾数:要求数符(最高符号位)与尾数的小数点后第一位必须相异,即正数规格化形式为 0.1xxx0.1xxx,负数规格化形式为 1.0xxx1.0xxx
  • 不满足规格化时的调整策略
    • 左规:当尾数绝对值太小(如出现 0.00...0.00...1.11...1.11... 结构)时,执行左规。尾数连续左移,阶码相应减 1,直至最高数值位对齐。
    • 右规:当双符号位求和出现 01.xx01.xx10.xx10.xx(即尾数溢出)时,执行右规。尾数右移 1 位,阶码加 1。

( 4 ) 为什么阵列除法器中能用 CAS 的进位/借位控制端作为上商的控制信号?#

解答

  • CAS单元的硬件特性:CAS 单元,即可控加减单元在阵列除法器中用于执行一步“试减”操作。其输出的进位或借位信号(CoutC_{out})直接反映了被除数/部分余数与除数相减的结果真假情况。
  • 借位信号与上商判定逻辑一致:如果试减后没有产生借位,表示部分余数大于或等于除数,够减,本位商应该上 1;如果产生借位,表示部分余数小于除数,不够减,本位商应该上 0。因此,CAS 的借位/进位输出刚好能直接作为本位商的控制信号。

( 5 ) 移位运算和乘法及除法运算有何关系?#

解答

  • 等价于乘以或除以基数:在不溢出或截断的情况下,左移一位等价于乘以 2,右移一位等价于除以 2。
  • 用于常数乘法优化:编译器通常通过左移与加减法的组合来优化乘以常数的计算(例如将 x×10x \times 10 转换为 (x3)+(x1)(x \ll 3) + (x \ll 1)),避免调用开销巨大的硬件乘法指令。
  • 构成乘除法迭代的基础:硬件乘除法电路本质上都是通过“加/减法 + 移位”的循环迭代算法实现的,移位电路是运算器实现乘除法最基础的硬件部件。

习题3.4 变形补码计算加法#

原题:已知 xxyy,用变形补码计算 x+yx+y,并判断结果是否溢出。

  1. x=0.11010,y=0.10111x = 0.11010, y = 0.10111
  2. x=0.11101,y=0.10100x = 0.11101, y = -0.10100
  3. x=0.10111,y=0.11000x = -0.10111, y = -0.11000

解答

变形补码使用双符号位进行加法。双符号位判定溢出规则为:00 表示正数且无溢出,11 表示负数且无溢出,01 表示正溢出,10 表示负溢出。

  1. x=0.11010,y=0.10111x = 0.11010, y = 0.10111: 写出双符号位变形补码: [x]=00.11010,[y]=00.10111[x]_\text{补} = 00.11010,\quad [y]_\text{补} = 00.10111 执行变形补码加法: 00.11010+00.1011101.10001\begin{array}{r} 00.11010 \\ + 00.10111 \\ \hline 01.10001 \end{array} 结果双符号位为 01,表示运算结果发生了正溢出。
  2. x=0.11101,y=0.10100x = 0.11101, y = -0.10100: 写出双符号位变形补码: [x]=00.11101[x]_\text{补} = 00.11101 正数 0.101000.10100 变形补码为 00.1010000.10100,按位取反加 1 得到其相反数补码为: [y]=11.01100[y]_\text{补} = 11.01100 执行变形补码加法: 00.11101+11.0110000.01001\begin{array}{r} 00.11101 \\ + 11.01100 \\ \hline 00.01001 \end{array} 丢弃最高进位,结果双符号位为 00,表示未溢出,运算结果 [x+y]=00.01001[x+y]_\text{补} = 00.01001(真值为 0.010010.01001)。
  3. x=0.10111,y=0.11000x = -0.10111, y = -0.11000: 写出双符号位变形补码: [x]=11.01001,[y]=11.01000[x]_\text{补} = 11.01001,\quad [y]_\text{补} = 11.01000 执行变形补码加法: 11.01001+11.0100010.10001\begin{array}{r} 11.01001 \\ + 11.01000 \\ \hline 10.10001 \end{array} 丢弃最高进位,结果双符号位为 10,表示运算结果发生了负溢出。

习题3.5 变形补码计算减法#

原题:已知 xxyy,用变形补码计算 xyx-y,并判断结果是否溢出。

  1. x=0.11011,y=0.11101x = 0.11011, y = 0.11101
  2. x=0.10111,y=0.11110x = 0.10111, y = 0.11110
  3. x=0.11111,y=0.11001x = -0.11111, y = -0.11001

解答

变形补码减法计算公式为 [xy]=[x]+[y][x - y]_\text{补} = [x]_\text{补} + [-y]_\text{补}

  1. x=0.11011,y=0.11101x = 0.11011, y = 0.11101[x]=00.11011,[y]=00.11101[x]_\text{补} = 00.11011,\quad [y]_\text{补} = 00.11101 求得 [y]=11.00011[-y]_\text{补} = 11.00011。相加: 00.11011+11.0001111.11110\begin{array}{r} 00.11011 \\ + 11.00011 \\ \hline 11.11110 \end{array} 丢弃最高位进位,结果双符号位为 11,表示未溢出,运算结果 [xy]=11.11110[x-y]_\text{补} = 11.11110(真值为 0.00010-0.00010)。
  2. x=0.10111,y=0.11110x = 0.10111, y = 0.11110[x]=00.10111,[y]=00.11110[x]_\text{补} = 00.10111,\quad [y]_\text{补} = 00.11110 求得 [y]=11.00010[-y]_\text{补} = 11.00010。相加: 00.10111+11.0001011.11001\begin{array}{r} 00.10111 \\ + 11.00010 \\ \hline 11.11001 \end{array} 结果双符号位为 11,表示未溢出,运算结果 [xy]=11.11001[x-y]_\text{补} = 11.11001(真值为 0.00111-0.00111)。
  3. x=0.11111,y=0.11001x = -0.11111, y = -0.11001[x]=11.00001,[y]=00.11001[x]_\text{补} = 11.00001,\quad [-y]_\text{补} = 00.11001 相加: 11.00001+00.1100111.11010\begin{array}{r} 11.00001 \\ + 00.11001 \\ \hline 11.11010 \end{array} 结果双符号位为 11,表示未溢出,运算结果 [xy]=11.11010[x-y]_\text{补} = 11.11010(真值为 0.00110-0.00110)。

习题3.6 原码一位乘法计算#

原题:用原码一位乘法计算 x×yx \times y

  1. x=0.11111,y=0.11101x = -0.11111, y = 0.11101
  2. x=0.11010,y=0.01011x = -0.11010, y = -0.01011

解答

  1. x=0.11111,y=0.11101x = -0.11111, y = 0.11101: 乘积符号:zf=xfyf=10=1zf = xf \oplus yf = 1 \oplus 0 = 1。 数值位绝对值乘积计算:设被乘数 B=11111B = 11111,乘数 C=11101C = 11101,部分积 AA 初始为 0000000000。 递推计算过程如下表所示:
步骤判定位 C0C_0运算说明部分积 A乘数 C
初始初始状态00000000001110111101
11A=A+BA = A + B11111111111110111101
联合右移 1 位01111011111111011110
20A=A+0A = A + 001111011111111011110
联合右移 1 位00111001111111111111
31A=A+BA = A + B1001101001101111111111
联合右移 1 位10011100110111101111
41A=A+BA = A + B1100101100100111101111
联合右移 1 位11001110010011100111
51A=A+BA = A + B1110001110000011100111
联合右移 1 位11100111000001100011

拼接部分积 AA 与乘数 CC 的高位部分,得到数值绝对值为 0.11100000110.1110000011。 加上负符号位,最终结果 x×y=0.1110000011x \times y = -0.1110000011,其原码机器数为 1.11100000111.1110000011

  1. x=0.11010,y=0.01011x = -0.11010, y = -0.01011: 乘积符号:zf=11=0zf = 1 \oplus 1 = 0。 数值位绝对值乘积计算:设被乘数 B=11010B = 11010,乘数 C=01011C = 01011,部分积 AA 初始为 0000000000。 递推计算过程如下表所示:
步骤判定位 C0C_0运算说明部分积 A乘数 C
初始初始状态00000000000101101011
11A=A+BA = A + B11010110100101101011
联合右移 1 位01101011010010100101
21A=A+BA = A + B1001111001110010100101
联合右移 1 位10011100111001010010
30A=A+0A = A + 010011100111001010010
联合右移 1 位01001010011100111001
41A=A+BA = A + B1000111000111100111001
联合右移 1 位10001100011110011100
50A=A+0A = A + 010001100011110011100
联合右移 1 位01000010001111011110

拼接部分积 AA 与乘数 CC 的高位部分,得到数值绝对值为 0.01000111100.0100011110。 加上正符号位,最终结果 x×y=+0.0100011110x \times y = +0.0100011110,其原码机器数为 0.01000111100.0100011110


习题3.7 补码一位乘法计算#

原题:用补码一位乘法(Booth 算法)计算 x×yx \times y

  1. x=0.10110,y=0.00011x = 0.10110, y = -0.00011
  2. x=0.011010,y=0.011101x = -0.011010, y = -0.011101

解答

  1. x=0.10110,y=0.00011x = 0.10110, y = -0.00011: 设字长为 1 位符号位 + 5 位数值位:[x]=0.10110[x]_\text{补} = 0.10110,则 [x]=1.01010[-x]_\text{补} = 1.01010。 乘数 [y]=1.11101[y]_\text{补} = 1.11101,引入附加位 y1=0y_{-1} = 0,部分积 AA 初始为 0.000000.00000。 递推计算过程如下表所示:
步骤判定位 ynyn+1y_n y_{n+1}运算说明部分积 A乘数 C,含附加位
初始初始状态00.0000000.000001.11101 01.11101\ 0
11 0A=A+[x]A = A + [-x]_\text{补}10.1010010.101001.11101 01.11101\ 0
算术右移 1 位11.0101011.010101.11110 11.11110\ 1
20 1A=A+[x]A = A + [x]_\text{补}00.0000000.000001.11110 11.11110\ 1
算术右移 1 位00.0000000.000000.11111 00.11111\ 0
31 0A=A+[x]A = A + [-x]_\text{补}10.1010010.101000.11111 00.11111\ 0
算术右移 1 位11.0101011.010100.01111 10.01111\ 1
41 1A=A+0A = A + 011.0101011.010100.01111 10.01111\ 1
算术右移 1 位11.1010111.101010.00111 10.00111\ 1
51 1A=A+0A = A + 011.1010111.101010.00111 10.00111\ 1
算术右移 1 位11.1101011.110101.00011 11.00011\ 1
61 1不右移(最后一步)11.1101011.110101.00011 11.00011\ 1

注意:对于数值位为 5 位的补码一位乘,需要完成 5 次算术右移,第 6 步仅根据最后一轮判定位执行加减,不右移。 拼接部分积 AA 与乘数 CC 的高位部分,得到最后的乘积补码:

[x×y]=11.1110111110[x \times y]_\text{补} = 11.1110111110

其真值结果为 0.0001000010-0.0001000010

  1. x=0.011010,y=0.011101x = -0.011010, y = -0.011101: 设字长为 1 位符号位 + 6 位数值位:[x]=1.100110[x]_\text{补} = 1.100110,则 [x]=0.011010[-x]_\text{补} = 0.011010。 乘数 [y]=1.100011[y]_\text{补} = 1.100011,引入附加位 y1=0y_{-1} = 0,部分积 AA 初始为 0.0000000.000000。 按照 Booth 算法规则执行 7 次“判定加减并算术右移”之后(最后一步不右移),可得乘积补码: [x×y]=00.001011110010[x \times y]_\text{补} = 00.001011110010 其真值结果为 +0.001011110010+0.001011110010

习题3.8 原码不恢复余数法除法计算#

原题:用原码不恢复余数法计算 x÷yx \div y

  1. x=0.10101,y=0.11011x = 0.10101, y = 0.11011
  2. x=0.10101,y=0.11000x = -0.10101, y = 0.11000

解答

  1. x=0.10101,y=0.11011x = 0.10101, y = 0.11011: 商符号:zf=00=0zf = 0 \oplus 0 = 0。 数值部分绝对值除法计算:被除数绝对值 x=0.10101|x| = 0.10101(整数化记为 21),除数绝对值 y=0.11011|y| = 0.11011(整数化记为 27)。 递推计算过程如下表所示:
步数余数符号执行操作计算过程及新部分余数 R商值
初始初始状态R0=21R_0 = 21
12RD2R - D2×2127=152 \times 21 - 27 = 151
22RD2R - D2×1527=32 \times 15 - 27 = 31
32RD2R - D2×327=212 \times 3 - 27 = -210
42R+D2R + D2×(21)+27=152 \times (-21) + 27 = -150
52R+D2R + D2×(15)+27=32 \times (-15) + 27 = -30

由于第 5 步结束后部分余数仍为负数,硬件需对其进行加除数修正(恢复余数):

R修正=3+27=24R_{\text{修正}} = -3 + 27 = 24

所得商数值为 0.110000.11000,余数为 24×21024 \times 2^{-10}。商符号为正,最终结果商为 0.110000.11000,余数为 0.00000110000.0000011000

  1. x=0.10101,y=0.11000x = -0.10101, y = 0.11000: 商符号:zf=10=1zf = 1 \oplus 0 = 1。 数值部分绝对值除法计算:x=21|x| = 21y=24|y| = 24。 递推计算过程如下表所示:
步数余数符号执行操作计算过程及新部分余数 R商值
初始初始状态R0=21R_0 = 21
12RD2R - D2×2124=182 \times 21 - 24 = 181
22RD2R - D2×1824=122 \times 18 - 24 = 121
32RD2R - D2×1224=02 \times 12 - 24 = 01
4正/非负2RD2R - D2×024=242 \times 0 - 24 = -240
52R+D2R + D2×(24)+24=242 \times (-24) + 24 = -240

第 5 步结束后部分余数为负,执行加除数修正:

R修正=24+24=0R_{\text{修正}} = -24 + 24 = 0

所得商数值为 0.111000.11100,余数为 00。商符号为负,最终结果商的原码表示为 1.111001.11100,余数为 00


习题3.9 机器补码浮点加法计算#

原题:设数的阶码为 3 位,尾数为 6 位(均不包括符号位),按机器补码浮点运算规则完成下列 [x+y][x+y]_\text{补} 运算。

  1. x=2011×0.100100,y=2010×(0.011010)x = 2^{011} \times 0.100100, y = 2^{010} \times (-0.011010)
  2. x=2101×(0.100010),y=2100×(0.010110)x = 2^{-101} \times (-0.100010), y = 2^{-100} \times (-0.010110)

解答

机器字长要求:阶码为 1 位符号位 + 3 位数值位,尾数为 1 位符号位 + 6 位数值位。

  1. x=2011×0.100100,y=2010×(0.011010)x = 2^{011} \times 0.100100, y = 2^{010} \times (-0.011010)

    • 阶码:Ex=3=0112Ex = 3 = 011_2Ey=2=0102Ey = 2 = 010_2
    • 对阶:小阶向大阶看齐。阶差 ΔE=32=1\Delta E = 3 - 2 = 1yy 的尾数右移 1 位,阶码加 1,得到: y=2011×(0.001101)y = 2^{011} \times (-0.001101)
    • 尾数求和: 0.100100+(0.001101)=0.0101110.100100 + (-0.001101) = 0.010111 和为正数,最高有效数值位为小数点后第二位,不满足规格化正尾数(0.1xxx0.1xxx)形式,需执行左规。
    • 规格化:尾数左移 1 位,阶码减 1。 左规后尾数变为 0.1011100.101110,阶码由 3 变为 2(二进制为 0102010_2)。
    • 最终补码表示为:阶码部分为 00100010,尾数部分为 0.1011100.101110。即 [x+y]=0010, 0.101110[x+y]_\text{补} = 0010\text{,}\ 0.101110
  2. x=2101×(0.100010),y=2100×(0.010110)x = 2^{-101} \times (-0.100010), y = 2^{-100} \times (-0.010110)

    • 阶码:Ex=5=1012Ex = -5 = -101_2Ey=4=1002Ey = -4 = -100_2
    • 对阶:大阶为 4-4。阶差 ΔE=4(5)=1\Delta E = -4 - (-5) = 1xx 对阶至 4-4,尾数右移 1 位: x=2100×(0.010001)x = 2^{-100} \times (-0.010001)
    • 尾数求和: 0.010001+(0.010110)=0.100111-0.010001 + (-0.010110) = -0.100111 和为负数,补码规格化负尾数应形如 1.0xxx1.0xxx。此数的补码形式符号位与第一位数值位相异,满足规格化形式,无需规格化调整。
    • 最终补码表示:阶码 4-4 对应的 4 位补码为 11001100。尾数 0.100111-0.100111 绝对值为 0.1001110.100111,求补码(取反加 1)得到 1.0110011.011001。即 [x+y]=1100, 1.011001[x+y]_\text{补} = 1100\text{,}\ 1.011001

习题3.10 IEEE 754 单精度浮点数计算#

原题:采用 IEEE 754 单精度浮点数格式计算下列表达式的值。

  1. 0.625+(12.25)0.625 + (-12.25)
  2. 0.625(12.25)0.625 - (-12.25)

解答

  1. 0.625+(12.25)0.625 + (-12.25)
    • 数学求和结果为 11.625-11.625
    • 11.625-11.625 转换为二进制: 11=10112,0.625=0.101211.625=1011.1012-11 = -1011_2,\quad 0.625 = 0.101_2 \rightarrow -11.625 = -1011.101_2
    • 对其进行 IEEE 754 规格化: 1011.1012=1.0111012×23-1011.101_2 = -1.011101_2 \times 2^3
    • 确定 IEEE 754 字段:
      • 符号位 S=1S = 1(负数)。
      • 阶码 E=3+127=130=100000102E = 3 + 127 = 130 = 10000010_2
      • 尾数 MM:隐藏最高位 1 后,余下小数部分为 0111012011101_2,补足 23 位得到: 0111010000000000000000001110100000000000000000
    • 拼接得 32 位机器数: 1 10000010 011101000000000000000001\ 10000010\ 01110100000000000000000 转换为十六进制为 C13A0000H\text{C13A0000H}
  2. 0.625(12.25)0.625 - (-12.25)
    • 结果为 12.87512.875
    • 转换为二进制:12.875=1100.111212.875 = 1100.111_2
    • 规格化:1.1001112×231.100111_2 \times 2^3
    • 确定字段:符号位 S=0S = 0(正数),阶码 E=3+127=130=100000102E = 3 + 127 = 130 = 10000010_2,尾数 M=100111000...M = 100111000...
    • 拼接得 32 位机器数: 0 10000010 100111000000000000000000\ 10000010\ 10011100000000000000000 转换为十六进制为 414E0000H\text{414E0000H}

习题3.11 C 语言程序与 8 位寄存器状态分析#

原题:假定在一个 8 位字长的计算机中运行如下 C 语言程序段:

unsigned int x=134;
unsigned int y=246;
int m=x; int n=y;
unsigned int z1=x-y;
unsigned int z2=x+y;
int k1=m-n;
int k2=m+n;

若编译器编译时将 8 个 8 位寄存器 R1 ~ R8 分别分配给变量 xymnz1z2k1x\text{、}y\text{、}m\text{、}n\text{、}z1\text{、}z2\text{、}k1k2k2。请回答下列问题:

  1. 执行上述程序段后,寄存器 R1、R5 和 R6 中的内容分别是什么?(用十六进制表示)
  2. 执行上述程序段后,变量 mmk1k1 的值分别是多少?(用十进制表示)
  3. 上述程序段涉及带符号整数加减、无符号整数加减运算,这 4 种运算能否利用同一个加法器及辅助电路实现?简述理由。
  4. 计算机内部如何判断带符号整数加减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?

解答

  1. R1、R5、R6 的十六进制内容
    • x=134=86Hx = 134 = 86_H,寄存器 R1 中的内容为 86H\text{86H}
    • y=246=F6Hy = 246 = \text{F6}_H,寄存器 R2 中的内容为 F6H\text{F6H}
    • z1=xy=134246=112z1 = x - y = 134 - 246 = -112。无符号减法在 8 位字长中按模 256 运算:112+256=144=90H-112 + 256 = 144 = 90_H。R5 中的内容为 90H\text{90H}
    • z2=x+y=134+246=380z2 = x + y = 134 + 246 = 380。无符号加法按模 256 截断:380256=124=7CH380 - 256 = 124 = 7\text{C}_H。R6 中的内容为 7CH\text{7CH}
  2. 变量 mmk1k1 的值
    • int m = x;:把机器数 86H86_H10000110210000110_2)按 8 位带符号补码进行解释。其最高位为 1,代表负数,真值为 134256=122134 - 256 = -122。所以 m=122m = -122
    • int n = y;:机器数 F6H\text{F6}_H 解释为有符号数:246256=10246 - 256 = -10
    • k1=mn=122(10)=112k1 = m - n = -122 - (-10) = -112。在有符号 8 位补码范围 [128,127][-128, 127] 内,因此 k1=112k1 = -112
  3. 加法器公用性判定
    • 完全可以公用同一个加法器:因为无论是有符号数还是无符号数,其在计算机底层的二进制位串加减运算规则是完全统一的。
    • 减法一律转换为加法 [AB]=[A]+[B]+1[A - B]_\text{补} = [A]_\text{补} + \sim [B]_\text{补} + 1 实现。加法器本身只进行无符号的二进制位相加,有无符号的唯一区别在于外部控制电路对溢出标志(OF\text{OF}CF\text{CF})的解释和监测方式不同。
  4. 有符号溢出判定与溢出语句
    • 有符号溢出判定:采用双符号位或者符号位进位与最高数值位进位异或判定 OF=CdCf\text{OF} = Cd \oplus Cf。对于加法,两个同号数相加,如果结果的符号与操作数符号相反,则发生溢出。
    • 溢出语句检测
      • int k1 = m - n:计算结果为 112-112,在有符号范围 [128,127][-128, 127] 内,未发生溢出。
      • int k2 = m + n:计算为 122+(10)=132-122 + (-10) = -132。因 132-132 小于 8 位补码能表示的最小值 128-128,发生了负溢出(硬件标志 OF=1\text{OF} = 1)。

习题3.12 乘法指令与硬件实现分析#

原题:有实现 x×yx \times y 的两个 C 语言函数如下:

unsigned umul(unsigned x, unsigned y) { return x*y; }
int imul(int x, int y) { return x*y; }

假定某计算机 M 中 ALU 只能进行加减运算和逻辑运算。请回答下列问题:

  1. 若 M 的指令系统中没有乘法指令,但有加法、减法和位移等指令,则在 M 上也能实现上述两个函数中的乘法运算,为什么?
  2. 若 M 的指令系统中有乘法指令,则基于 ALU、位移器、寄存器以及相应控制逻辑实现乘法指令时,控制逻辑的作用是什么?
  3. 针对以下三种情况:① 没有乘法指令;② 有使用 ALU 和位移器实现的乘法指令;③ 有使用阵列乘法器实现的乘法指令。函数 umul() 在哪种情况下执行时间最长?哪种情况下执行时间最短?说明理由。
  4. n=32,x=2311,y=2n=32, x=2^{31}-1, y=2 时,带符号整数乘法指令和无符号整数乘法指令得到的 2n2n 位乘积分别是什么?此时函数 umul()imul() 的返回结果是否溢出?对于无符号整数乘法运算,当仅取低 nn 位作为乘积时,如何判定是否发生溢出?

解答

  1. 无乘法指令时实现乘法的原因
    • 乘法在数学上等价于多次“位移与加法”的累加迭代。例如无符号数乘法可表示为: x×y=i=0n1yi(xi)x \times y = \sum_{i=0}^{n-1} y_i (x \ll i)
    • 编译器可以通过将乘积展开为判断乘数各权位是否为 1,进而进行相应的左移及加法累加循环来实现乘法。因此,仅靠加减与位移指令完全可以实现乘法函数。
  2. 控制逻辑的作用
    • 控制逻辑在硬件中充当控制器的作用,负责协调整个移位加法电路的时序。它负责:检查乘数的当前权位、控制 ALU 执行加法或减法、发出部分积及乘数的移位脉冲、控制迭代循环次数以及判断乘法运算是否完成。
  3. 三种实现方式的执行速度对比
    • 执行时间最长:① 没有乘法指令。因为乘法必须被翻译成多条加法、移位、循环及分支跳转指令,在 CPU 中占用大量的时钟周期。
    • 执行时间最短:③ 采用阵列乘法器。阵列乘法器由纯并行硬件单元构成,能够在一个或极少的时钟周期内直接输出乘积结果,速度极快。
  4. 数值计算与溢出判定
    • 2n2n 位乘积计算: 已知 x=2311=7FFFFFFFHx = 2^{31} - 1 = \text{7FFFFFFFH}y=2=00000002Hy = 2 = \text{00000002H}。 有符号与无符号下的数学乘积均为 (2311)×2=2322(2^{31}-1) \times 2 = 2^{32}-2。转换为 64 位(2n2n 位)二进制十六进制为 00000000 FFFFFFFEH\text{00000000 FFFFFFFEH}
    • 函数返回结果溢出判定
      • umul():截断保留低 32 位,返回 FFFFFFFEH\text{FFFFFFFEH}。按无符号数解释,该值等于 42949672944294967294,在 32 位无符号整数表示范围内,因此未发生溢出
      • imul():截断保留低 32 位,返回 FFFFFFFEH\text{FFFFFFFEH}。按补码有符号数解释,该值真值为 2-2,而正确数学结果为 42949672944294967294(超出 32 位有符号整数最大范围),因此发生溢出
    • 无符号乘法低 nn 位溢出判定规则
      • 检查 2n2n 位乘积的高 nn 位。若高 nn 位全为 0,则不溢出;若高 nn 位中含有非 0 字符,则说明乘积超出了低 nn 位所能表示的上限,判定为发生溢出。

习题3.13 电路延迟与成本开销分析#

原题:如果全加器采用图 3.2 (b) 所示的方案实现,尝试分析图 3.3 ~ 图 3.8 所示电路的时间延迟和成本开销,你认为与图 3.2 (a) 所示方案相比哪个方案更好,为什么?

解答

全加器的两种方案通常指:方案 a 为“基于两级异或门实现和位、并复用异或输出生成进位”的传统方案;方案 b 为“基于与-或逻辑直接生成进位、和位采用三输入异或门”的并行加速方案。

  • 时间延迟分析
    • 在传统的方案 a 中,进位的生成依赖于第一级异或门的输出,因此进位延迟较大(异或门延迟通常显著大于与门/或门延迟)。
    • 在方案 b 中,进位 Ci+1C_{i+1} 采用与-或两级门电路直接并行产生,其进位延迟仅为 2t 延迟,显著低于方案 a。对于依靠串行进位链传递的行波进位加法器(图 3.3)与单元数目巨大的阵列乘法器、阵列除法器(图 3.5 ~ 图 3.8),其关键路径完全由进位链决定。因此,采用方案 b 能极大降低这些电路的总体时间延迟,提升工作主频。
  • 成本开销分析
    • 方案 b 由于进位与和位逻辑完全分离,无法复用异或中间项,且在全加器内部需要使用更多的与门、或门以及三输入异或门,导致单个全加器的晶体管(门)开销显著增加。在大型加法器或阵列乘除法器中,这会导致硬件成本和面积开销有所上升。
  • 方案优劣判定与折中结论
    • 对于行波进位加法器阵列乘除法器等进位传递是关键路径瓶颈的电路,方案 b 更好。因为进位延迟的微小降低在串行累加后会带来系统性能的飞跃,所付出的硬件成本增加是完全值得的。
    • 对于图 3.4 中的超前进位加法器,由于每一位的进位是由独立的超前进位单元并行计算生成的,并不依赖于全加器内部的串行进位链。全加器仅需向外输出进位产生函数 GiG_i 和进位传递函数 PiP_i。在此场景下,方案 a 更好。因为它可以更低成本、更自然地输出 Pi=AiBiP_i = A_i \oplus B_i,同时规避了方案 b 带来的额外硬件面积浪费。

3.8 本章总结#

知识体系关系链#

位运算与逻辑运算
基础半加器与全加器
补码加减法运算 ───(结合)─── 溢出检测逻辑
移位运算 ───(结合)─── 原码与补码乘除法
尾数运算与阶码处理相结合
浮点数加减运算五步法
运算器硬件通路与状态标志寄存器

核心考点记忆口诀#

补码加减:符号位一起算,最高进位可丢掉。 减法实现:取反再加一,本质仍然是加法。 溢出判断:同号相加变异号,亦或进位判不同。 移位运算:左移低补零,逻辑右高补零,算术右高补符号。 原码乘法:符号异或定,数值绝对做累加,右移重复数位次。 浮点加减:先对阶,再尾加,后规格,最终舍入判溢出。 运算核心:算术逻辑单元,辅以寄存移位与状态标志。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

运算方法与运算器
https://dawn114514.site/posts/计组/运算方法与运算器/
作者
黎明
发布于
2026-06-28 11:40:00
许可协议
MIT

部分信息可能已经过时

目录