2.2 定点数的运算 (答案见原书 P93)
第2章 数据的表示和运算
2.2 定点数的运算 (答案见原书 P93)
01. ALU作为运算器的核心部件,其下面( B )不是组成运算器的部件。
题目原文
- ALU作为运算器的核心部件,其下面( )不是组成运算器的部件。
A. 时序逻辑电路
B. 组合逻辑电路
C. 控制器
D. 寄存器
正确答案:B
题目解析
- 考点分析: 本题考察对CPU两大核心部件——运算器和控制器的组成区分。
- 【答案校对与分析】 您提供的答案是
B (组合逻辑电路)
。但这个答案是错误的。- ALU(算术逻辑单元) 本身就是一个典型的组合逻辑电路,它是运算器的核心。
- 运算器的组成包括:ALU、累加器(ACC)、通用寄存器组(GPRs)、程序状态字寄存器(PSW)等。寄存器是时序逻辑电路。
- 控制器 © 是与运算器并列的CPU两大部件之一,它不属于运算器。
- 时序逻辑电路 (A) 和 寄存器 (D) 都是运算器的组成部分。
- 结论: 标准答案应该是 C. 控制器。如果答案确定是B,那么题目或答案存在严重错误,因为ALU就是组合逻辑电路。此处我们按标准理论将C作为正确答案进行解析。
02. 组成一个运算器需要多个部件,但下面( D )不是组成运算器的部件。
题目原文
02. 组成一个运算器需要多个部件,但下面( )不是组成运算器的部件。
A. 状态寄存器
B. 数据总线
C. ALU
D. 地址寄存器
正确答案:D
题目解析
- 考点分析: 本题再次考察运算器的组成。
- 正确选项分析 (D. 地址寄存器):
- 地址寄存器(如PC, MAR)是用于处理地址信息的,它们属于控制器或CPU与总线的接口部分,其主要功能是控制程序的流程和内存的访问,而不是进行数据运算。
- 错误选项分析(属于运算器或与运算器密切相关):
- A. 状态寄存器 (PSW): 用于存放ALU运算结果的状态(零、负、溢出、进位),是运算器的核心组成部分。
- B. 数据总线: 是运算器与CPU内外其他部件交换数据的通路,与运算器紧密相连。
- C. ALU: 运算器的核心。
03. 算术逻辑单元(ALU)的功能一般包括( C )。
题目原文
03. 算术逻辑单元(ALU)的功能一般包括( )。
A. 算术运算
B. 逻辑运算
C. 算术运算和逻辑运算
D. 加法运算
正确答案:C
题目解析
- 考点分析: 本题考察ALU的全称和基本功能。
- 正确选项分析 (C. 算术运算和逻辑运算):
- ALU 的全称就是 Arithmetic Logic Unit,即算术逻辑单元。
- 顾名思义,它的核心功能就是执行两大类操作:
- 算术运算: 如加、减、乘、除。
- 逻辑运算: 如与(AND)、或(OR)、非(NOT)、异或(XOR)。
- 错误选项分析:
- A, B, D: 描述不全面,只提到了ALU功能的一部分。
04. 补码定点整数0101 0101 算术右移两位后的值为( B )。
题目原文
04. 补码定点整数0101 0101 算术右移两位后的值为( )。
A. 0100 0111
B. 0101 0100
C. 0100 0110
D. 0101 0101
正确答案:B
题目解析
- 考点分析: 本题考察算术右移的操作规则。
- 算术右移规则:
- 将所有位向右移动指定的位数。
- 高位(左侧) 用原始符号位填充。
- 低位(右侧) 被移出并丢弃。
- 计算过程:
- 原始数值:
0101 0101
- 确定符号位: 最高位是
0
(正数)。 - 右移一位:
- 高位用
0
填充。 - 结果:
0010 1010
- 高位用
- 再右移一位:
- 高位用
0
填充。 - 结果:
0001 0101
- 高位用
- 原始数值:
- 【答案校对与分析】 您提供的答案是
B (0101 0100)
。我的计算结果是0001 0101
。- 答案
B
是如何得到的?0101 0101
如果是逻辑右移两位,高位补0,结果是0001 0101
。 - 如果题目是循环右移两位,结果是
0101 0101
->1010 1010
->1101 0101
。 - 如果题目是算术左移两位,结果是
0101 0101
->1010 1010
->0101 0100
(发生溢出)。 - 结论: 题目问的是“算术右移”,但给出的答案
B
对应的是“算术左移”的结果。此题的题目或答案存在严重错误。如果答案确定是B,那么题目应该问的是“算术左移”。
- 答案
05. 下列四个码补码整数存放于8位寄存器中,算术右移不会发生溢出的是( D )。
题目原文
05. 下列四个码补码整数存放于8位寄存器中,算术右移不会发生溢出的是( )。
A. 80H
B. 90H
C. B0H
D. C0H
正确答案:D
题目解析
- 考点分析: 本题考察算术移位的溢出判断。
- 溢出规则:
- 算术左移: 当移位后,符号位发生改变时,产生溢出。
- 算术右移: 永远不会发生溢出。因为算术右移是除以2的幂次,一个数无论怎么除,结果都不会超出其表示范围。
- 【答案校对与分析】 您提供的答案是
D
。但根据溢出规则,算术右移是不可能溢出的。这意味着A, B, C, D都不会溢出。- 这道题很可能又是将“右移”写成了“左移”。我们按“算术左移”来重新分析。
- 按“算术左移一位”分析:
- 算术左移规则: 低位补0,高位移入符号位,原符号位丢弃。溢出判断:新符号位 != 原符号位。
- A. 80H =
1000 0000
(表示-128)。左移一位 ->0000 0000
。符号位由1变0,溢出。 - B. 90H =
1001 0000
(表示-112)。左移一位 ->0010 0000
。符号位由1变0,溢出。 - C. B0H =
1011 0000
(表示-80)。左移一位 ->0110 0000
。符号位由1变0,溢出。 - D. C0H =
1100 0000
(表示-64)。左移一位 ->1000 0000
。符号位由1变1,不溢出。
- 结论: 如果题目问的是“算术左移”,那么答案D是正确的。
06. 补码定点整数1001 0101 右移一位后的值为( D )。
题目原文
06. 补码定点整数1001 0101 右移一位后的值为( )。
A. 0100 1010
B. 0100101 0
C. 1000 1010
D. 1100 1010
正确答案:D
题目解析
- 考点分析: 本题考察负数的算术右移。
- 分析过程:
- 题目没有明确是“算术右移”还是“逻辑右移”,但在处理补码整数时,默认指算术右移。
- 原始数值:
1001 0101
- 确定符号位: 最高位是
1
(负数)。 - 算术右移一位:
- 所有位向右移动一位。
- 高位用原始符号位
1
填充。 - 低位的
1
被移出丢弃。 - 结果:
1100 1010
。
- 结论: 右移一位后的值为
1100 1010
。
07. 两个机器数7E5H和4D3H相加,得( C )。
题目原文
07. 两个机器数7E5H和4D3H相加,得( )。
A. BD8H
B. CD8H
C. CB8H
D. CC8H
正确答案:C
题目解析
- 考点分析: 本题考察十六进制加法。
- 计算过程:
- 采用对位向加,逢16进1的原则。
7 E 5 H+ 4 D 3 H----------
- 最低位:
5 + 3 = 8
。 - 中间位:
E + D
=14 + 13 = 27
。27 = 1 * 16 + 11
。11
对应的十六进制是B
。- 所以,本位写
B
,向高位进1
。
- 最高位:
7 + 4 + (进位1) = 12
。12
对应的十六进制是C
。
- 结论: 结果是
CB8H
。
08. 设机器数字长8位(含1位符号位),若机器数BAH为补码,算术左移1位和算术右移1位分别得( C )。
题目原文
08. 设机器数字长8位(含1位符号位),若机器数BAH为补码,算术左移1位和算术右移1位分别得( )。
A. F4H, EDH
B. B4H, 6DH
C. 74H, DDH
D. B5H, EDH
正确答案:C
题目解析
- 考点分析: 本题综合考察算术左移和算术右移。
- 分析过程:
- 转换原始数:
BAH
(十六进制) =1011 1010
(二进制)。- 这是一个负数。
- 计算算术左移1位:
- 规则: 低位补0,高位丢弃。
1011 1010
<< 1 =0111 0100
。0111 0100
(二进制) =74H
(十六进制)。- 溢出判断: 原符号位为1,新符号位为0,发生溢出。但题目只问结果。
- 计算算术右移1位:
- 规则: 高位用符号位填充,低位丢弃。
- 原符号位是
1
。 1011 1010
>> 1 =1101 1101
。1101 1101
(二进制) =DDH
(十六进制)。
- 转换原始数:
- 结论: 左移得74H,右移得DDH。
09. 在定点运算器中,无论采用双符号位还是单符号位,必须有( C )。
题目原文
09. 在定点运算器中,无论采用双符号位还是单符号位,必须有( )。
A. 译码电路,它一般用“与非”门来实现
B. 编码电路,它一般用“或非”门来实现
C. 溢出判断电路,它一般用“异或”门来实现
D. 移位电路,它一般用“与或非”门来实现
正确答案:C
题目解析
- 考点分析: 本题考察定点运算器中必不可少的硬件逻辑。
- 正确选项分析 (C. 溢出判断电路,它一般用“异或”门来实现):
- 在进行有符号数加减法时,结果可能会超出表示范围,即溢出。
- CPU必须能够检测到溢出,并设置OF标志位,以保证运算的正确性。因此,溢出判断电路是运算器中必不可少的部分。
- 溢出判断的硬件实现:
- 单符号位:
OF = C_n XOR C_(n-1)
(最高位进位与次高位进位异或)。 - 双符号位 (
S_f1 S_f2
):OF = S_f1 XOR S_f2
。
- 单符号位:
- 在这两种情况下,核心逻辑都是异或门。
- 错误选项分析:
- A, B: 译码和编码电路是控制器或外设接口的常见部件,不是运算器的核心必备。
- D: 移位电路是运算器的功能之一,但不是“必须有”的(一些极简CPU可能没有硬件移位器),且其实现方式多样。溢出判断是所有加减法器都必须具备的。
10. 机器运算发生溢出的根本原因是( A )。
题目原文
10. 机器运算发生溢出的根本原因是( )。
A. 运算器的位数有限
B. 运算中符号位发生错误
C. 运算中符号位的借位
D. 数据运算中发生错误
正确答案:A
题目解析
- 考点分析: 本题考察对“溢出”这一概念本质的理解。
- 正确选项分析 (A. 运算器的位数有限):
- 溢出的定义是:运算结果超出了机器数所能表示的范围。
- 为什么会有“范围”?就是因为计算机中的所有运算器、寄存器、数据通路都具有固定的、有限的位数(如8位、16位、32位)。
- 如果运算结果的绝对值太大,需要更多的位数来表示,而机器的位数又不够,那么最高有效位就会丢失或“侵占”符号位,从而导致结果错误,这就是溢出。
- 因此,运算器(机器字长)的位数有限是发生溢出的根本原因。
- 错误选项分析:
- B, C, D: 都是对溢出现象的描述或结果,而不是根本原因。例如,“符号位发生错误”是溢出的一种表现,而不是原因。
11. 假定有两个整数用8位补码分别表示为r1=F5H,r2=EEH。若将运算结果存放在一个8位寄存器中,则下列运算会发生溢出的是( C )。
题目原文
11. 假定有两个整数用8位补码分别表示为r1=F5H,r2=EEH。若将运算结果存放在一个8位寄存器中,则下列运算会发生溢出的是( )。
A. r1+r2
B. r1-r2
C. r1×r2
D. r1/r2
正确答案:C
题目解析
- 考点分析: 本题考察8位补码运算的溢出判断,特别是乘法溢出。
- 分析过程:
- 转换r1和r2为十进制:
r1 = F5H = 1111 0101
(补码)。F5-100 = -B
->-11
。或者-(2^8 - F5H) = -(256 - 245) = -11
。r2 = EEH = 1110 1110
(补码)。EE-100 = -12
->-18
。或者-(2^8 - EEH) = -(256 - 238) = -18
。
- 逐项分析运算:
- A. r1+r2:
(-11) + (-18) = -29
。- 8位补码表示范围是
-128
到+127
。-29
在范围内,不溢出。 - 二进制加法:
1111 0101 + 1110 1110 = (1) 1110 0011
->E3H
。E3H
转十进制是-29
。
- 8位补码表示范围是
- B. r1-r2:
(-11) - (-18) = -11 + 18 = +7
。+7
在范围内,不溢出。- 二进制减法:
F5H + (-EEH)_补 = F5H + 12H = 07H
。
- C. r1×r2:
(-11) * (-18) = +198
。+198
超出了8位有符号数的最大值+127
。因此,发生溢出。
- D. r1/r2:
(-11) / (-18) = 0
(整数除法)。0
在范围内,不溢出。
- A. r1+r2:
- 转换r1和r2为十进制:
- 结论: 乘法运算会发生溢出。
12. 关于4补码和模2补码,下列说法正确的是( B )。
(该题题干中的“4补码”和“模2补码”应为“4位补码”和“模2^4补码”或指变形补码。此处按双符号位变形补码理解)
题目原文
12. 关于4补码和模2补码,下列说法正确的的是( )。
A. 模4补码和模2补码不同,它不容易检查运算中的溢出问题
B. 每个模4补码存储时需两个符号位
C. 存储每个模4补码需要两个符号位
D. 模4补码,在算术单元中为两个符号位
正确答案:B
题目解析
- 考点分析: 本题考察变形补码(双符号位补码) 的概念。
- 正确选项分析 (B. 每个模4补码存储时需两个符号位):
- “模4补码”或“双符号位补码”是一种用于溢出检测的编码方式。
- 它采用两位来表示符号:
00
表示正号。11
表示负号。
- 在运算过程中,如果结果的两个符号位不相同(即为
01
或10
),就表示发生了溢出。01
表示正溢出(上溢)。10
表示负溢出(下溢)。
- 因此,这种编码的核心特征就是使用两个符号位。选项B和C是同义的,都是正确的描述。
- 错误选项分析:
- A: 变形补码的主要目的就是为了简化溢出检测,只需判断两位符号位是否相异即可,非常容易检查。
- D: “算术单元中为两个符号位”不准确,应该说整个编码表示都采用双符号位。
13. 若采用双符号位,则两个正数相加产生溢出的特征时,双符号位为( B )。
题目原文
13. 若采用双符号位,则两个正数相加产生溢出的特征时,双符号位为( )。
A. 00
B. 01
C. 10
D. 11
正确答案:B
题目解析
- 考点分析: 本题考察双符号位补码中正溢出的表示。
- 正确选项分析 (B. 01):
- 两个正数相加,如果发生溢出,意味着结果超出了正数的最大表示范围,变成了一个“假”的负数。
- 在双符号位补码中:
- 两个正数的符号位都是
00
。 - 相加后,数值部分的最高位会向符号位的低位产生一个进位
1
。 - 符号位的加法
00 + 00 + (来自数值位的进位1) = 01
。
- 两个正数的符号位都是
- 结果的符号位变为
01
,这正是正溢出(上溢) 的标志。
- 错误选项分析:
- A. 00: 表示结果为正,未溢出。
- C. 10: 表示负溢出(下溢),由两个负数相加得到一个“假”的正数产生。
- D. 11: 表示结果为负,未溢出。
14. 判断加法或减法运算的结果是否发生溢出的方式,可采用进位的方法,若符号位的进位为C0,最高位的进位为C1,则产生溢出的条件是( D )。
题目原文
14. 判断加法或减法运算的结果是否发生溢出的方式,可采用进位的方法,若符号位的进位为C0,最高位的进位为C1,则产生溢出的条件是( )。
A. C0=C1
B. C0≠C1
C. C0=1, C1=0
D. C1=C0
(注:常规表示C1为符号位进位,C0为最高数值位进位。题目描述相反,但逻辑不变)
正确答案:D
题目解析
- 考点分析: 本题考察用“双进位”法判断单符号位补码运算溢出的逻辑。
- 标准定义:
C_s
: 符号位的进位(即从符号位产生的进位)。C_x
: 最高数值位的进位(即进入符号位的进位)。- 溢出公式:
OF = C_s XOR C_x
,即C_s ≠ C_x
。
- 按题目定义分析:
C0
: 符号位的进位。(对应标准C_s
)C1
: 最高位的进位。(对应标准C_x
)- 溢出条件
OF=1
当且仅当C0 ≠ C1
。
- 【答案校对与分析】 您提供的答案是
D (C1=C0)
,即不溢出。而题目问的是“产生溢出的条件是”。- 产生溢出的条件应该是
C0 ≠ C1
(选项B)。 - 不产生溢出的条件才是
C0 = C1
(选项A和D是同义的)。 - 结论: 此题的问法和答案存在矛盾。如果答案是D,那么题目应该问“不产生溢出的条件是”。
- 产生溢出的条件应该是
15. 在补码的加减法中,用两位符号位S1S2判断溢出时,表示( C )。
题目原文
15. 在补码的加减法中,用两位符号位S1S2判断溢出时,表示( )。
A. 结果为正数,无溢出
B. 结果为正数,无溢出
C. 结果负溢出
D. 结果为负数,无溢出
[选项应为四种情况]
题目原文(根据逻辑补全):
15. 在补码的加减法中,用两位符号位S_f1 S_f2判断溢出,当S_f1 S_f2 = 10
时,表示( )。
A. 结果为正,无溢出
B. 结果为正,有溢出
C. 结果为负,有溢出
D. 结果为负,无溢出
正确答案:C
题目解析
- 考点分析: 本题与第13题类似,考察双符号位补码中负溢出的表示。
- 正确选项分析 (C. 结果为负,有溢出):
- 当双符号位
S_f1 S_f2
不相等时,表示发生溢出。 - 两个负数相加,如果发生溢出,意味着结果的绝对值太大,超出了负数的表示范围,变成了一个“假”的正数。
- 在双符号位补码中:
- 两个负数的符号位都是
11
。 - 相加后,数值部分的最高位会向符号位的低位产生一个进位
1
。 - 符号位的加法
11 + 11 + (进位1)
=1 + 1 + 1
(二进制) =1
(本位) 进1
(高位)。 - 结果的符号位变为
10
。
- 两个负数的符号位都是
10
正是负溢出(下溢) 的标志。
- 当双符号位
- 结论: 结果是负溢出。
16. 设[X]补=X0.X1X2…Xn,其中X0为符号位,X1为最高数位。若( B ),则当补码算术左移时,会发生溢出。
题目原文
16. 设[X]补=X0.X1X2…Xn,其中X0为符号位,X1为最高数位。若( ),则当补码算术左移时,会发生溢出。
A. X0 = X1
B. X0 ≠ X1
C. X1 = 0
D. X1 = 1
正确答案:B
题目解析
- 考点分析: 本题考察算术左移溢出的判断条件。
- 正确选项分析 (B. X0 ≠ X1):
- 算术左移一位,相当于乘以2。
- 溢出发生在运算结果超出了表示范围。
- 在算术左移中,最高数位
X1
将会被移到符号位X0
的位置,成为新的符号位。 - 如果新的符号位 (
X1
) 与原来的符号位 (X0
) 不相同,就意味着一个正数乘以2变成了负数,或者一个负数乘以2变成了正数(符号位0
被1
覆盖除外,如-128)。这正是溢出的定义。
- 错误选项分析:
- A:
X0 = X1
是不溢出的条件。 - C, D: 单独看
X1
的值无法判断是否溢出,必须与X0
比较。
- A:
17. 原码乘法是( A )。
题目原文
17. 原码乘法是( )。
A. 先取操作数绝对值相乘,符号位单独处理
B. 用原码表示操作数,然后直接相乘
C. 被乘数用原码表示,乘数取绝对值,然后相乘
D. 乘数用原码表示,被乘数取绝对值,然后相乘
正确答案:A
题目解析
- 考点分析: 本题考察原码乘法的基本规则。
- 正确选项分析 (A. 先取操作数绝对值相乘,符号位单独处理):
- 原码乘法的实现非常直观,模仿了笔算乘法:
- 符号位单独处理: 将两个操作数的符号位进行异或(XOR) 运算,得到结果的符号位。(同号得正,异号得负)。
- 数值位(绝对值)相乘: 将两个操作数的绝对值部分进行无符号乘法运算。
- 原码乘法的实现非常直观,模仿了笔算乘法:
- 错误选项分析:
- B, C, D: 描述不准确。必须是两个数的绝对值部分相乘。
18. 在原码乘法中,( B )。
题目原文
18. 在原码乘法中,( )。
A. 符号位参加运算
B. 符号位不参加运算
C. 符号位参加运算,并根据运算结果改变结果中的符号
D. 符号位不参加运算,并根据运算结果确定结果中的符号
正确答案:B
题目解析
- 考点分析: 本题与上一题考点相同,再次强调原码乘法中符号位的处理方式。
- 正确选项分析 (B. 符号位不参加运算):
- 如上所述,在原码乘法中,符号位是独立于数值部分进行处理的。
- 数值部分的乘法是无符号乘法,不涉及符号。
- 因此,可以说符号位不参与数值部分的乘法运算。
- 错误选项分析:
- A, C: 符号位不参与数值运算。
- D: 结果的符号由操作数的符号决定,而不是由“运算结果”决定。
19. 原码乘法时,( C )。
题目原文
19. 原码乘法时,( )。
A. 两个操作数的符号相“异或”
B. 两个操作数的符号相“与”
C. 两个操作数的符号相“或”
D. 两个操作数的符号中绝对值较大的符号
正确答案:C
题目解析
- 考点分析: 本题考察原码乘法中符号位的具体逻辑运算。
- 【答案校对与分析】 您提供的答案是
C (相“或”)
。但标准的符号位处理规则是异或 (XOR)。- 异或规则 (标准):
0 XOR 0 = 0
(正 * 正 = 正)1 XOR 1 = 0
(负 * 负 = 正)0 XOR 1 = 1
(正 * 负 = 负)1 XOR 0 = 1
(负 * 正 = 负)
- 或规则 (答案C):
0 OR 0 = 0
(正 * 正 = 正)1 OR 1 = 1
(负 * 负 = 负) -> 错误!0 OR 1 = 1
(正 * 负 = 负)1 OR 0 = 1
(负 * 正 = 负)
- 异或规则 (标准):
- 结论: 标准的、正确的逻辑运算是异或 (XOR),对应选项A。您提供的答案C是错误的。此处我们按标准答案A进行解析。
20. 下列关于移位运算的说法中,正确的是( D )。
I. 补码算术左移时,高位移出,低位补0,若左移前后的符号位不同,则发生溢出
II. 无符号数逻辑左移时,若最高位移出是1,则发生溢出
III. 逻辑左移和补码算术左移的结构都一样,都是移出最高位,并在低位补0
正确答案:D
题目解析
- 考点分析: 本题综合对比算术移位和逻辑移位的规则与溢出判断。
- 逐项分析:
- I. …补码算术左移…若符号位不同,则发生溢出: 正确。这是补码算术左移溢出的标准判断方法。
- II. …无符号数逻辑左移…最高位移出是1,则发生溢出: 正确。逻辑左移相当于乘以2。对于无符号数,如果最高有效位(MSB)被移出,就意味着结果超出了该位数所能表示的最大无符号数范围,即发生溢出。
- III. 逻辑左移和补码算术左移的结构都一样…: 正确。从硬件实现的角度看,这两种左移操作的数据通路是完全一样的:都是将所有位向左移动一位,最高位移出,最低位补0。它们的区别仅在于溢出条件的判断逻辑不同。
- 组合判断: I、II、III 都是正确的描述。
21. 某计算机字长为8位,CPU中有一个8位加法器。已知无符号数x=69,y=38,若在加法器中计算x-y,则加法器的两个输入信息和输入的低位进位信息分别为( B )。
题目原文
21. 某计算机字长为8位,CPU中有一个8位加法器。已知无符号数x=69,y=38,若在加法器中计算x-y,则加法器的两个输入信息和输入的低位进位信息分别为( )。
A. 0100 0101、0101 1001、1
B. 0100 0101、1101 1001、1
C. 0100 0101、1101 1010、0
D. 0100 0101、1101 1010、1
正确答案:B
题目解析
- 考点分析: 本题考察如何用加法器实现减法,涉及补码和反码的概念。
- 背景知识:
x - y
在计算机中通过x + (-y)_补
实现。(-y)_补 = (y的反码) + 1
。- 因此,
x - y = x + (y的反码) + 1
。 - 加法器有三个输入:输入A,输入B,和来自低位的进位输入
C_in
。 - 我们可以将
x
送入输入A,y的反码
送入输入B,并将C_in
设置为1
。
- 计算过程:
- 转换x为二进制:
x = 69
(十进制) =64 + 4 + 1 = 2^6 + 2^2 + 2^0
=0100 0101
(8位二进制)。
- 转换y为二进制:
y = 38
(十进制) =32 + 4 + 2 = 2^5 + 2^2 + 2^1
=0010 0110
(8位二进制)。
- 求y的反码:
y的反码 = 1101 1001
。
- 确定加法器输入:
- 输入A =
x
=0100 0101
。 - 输入B =
y的反码
=1101 1001
。 - 低位进位输入
C_in
=1
。
- 输入A =
- 转换x为二进制:
- 结论: 两个输入信息分别是
0100 0101
和1101 1001
,低位进位信息是1
。
22. 某计算机有一个8位加法器,有符号整数x和y的机器数用补码表示,[x]补=F5H,[y]补=7EH,若在该加法器中计算x-y,则加法器的低位输入信息和运算后的溢出标志OF分别为( A )。
正确答案:A
题目解析
- 考点分析: 本题综合考察补码减法、加法器实现减法以及溢出判断。
- 计算过程:
- 确定加法器输入:
- 计算
x - y
,即x + (-y)_补
。 [x]_补 = F5H
。[y]_补 = 7EH
。[-y]_补
= 对[y]_补
变号(各位取反,末位加1)。7EH = 0111 1110
- 取反:
1000 0001
- 加1:
1000 0010
=82H
。
- 因此,加法器要计算的是
F5H + 82H
。 - 如果用反码实现,则是
F5H + (7EH的反码) + C_in
。7EH
的反码 =1000 0001
=81H
。- 低位进位输入
C_in = 1
。
- 计算
- 判断溢出 (OF):
- 方法1(十进制):
[x]_补 = F5H
->x = -11
。[y]_补 = 7EH
->y = +126
。x - y = -11 - 126 = -137
。- 8位补码的表示范围是
-128
到+127
。 -137
超出了表示范围,发生了负溢出。所以 OF = 1。
- 方法2(符号位):
x
是负数,y
是正数。- 一个负数减去一个正数,结果应该是一个更小的负数。
- 如果结果变成正数,则发生溢出。
- 计算
F5H + 82H
:
1111 0101 (F5H)+ 1000 0010 (82H)-----------(1)0111 0111
- 结果是
77H
,符号位为0(正数)。 - 负数减正数得到正数,溢出。所以 OF = 1。
- 方法1(十进制):
- 确定加法器输入:
- 结论: 低位输入信息是
1
,溢出标志OF是1
。
23. 某8位计算机中,x和y是两个有符号整数,用补码表示,[x]补=44H,[y]补=DCH,则x/2+2y的机器数及相应的标志OF分别为( C )。
正确答案:C
题目解析
- 考点分析: 本题考察算术右移、算术左移和加法运算的综合应用及溢出判断。
- 计算过程:
- 计算 x/2:
x/2
相当于对[x]_补
进行一次算术右移。[x]_补 = 44H = 0100 0100
(正数)。- 算术右移一位(高位补0):
0010 0010
=22H
。
- 计算 2y:
2y
相当于对[y]_补
进行一次算术左移。[y]_补 = DCH = 1101 1100
(负数)。- 算术左移一位(低位补0):
1011 1000
=B8H
。 - 判断2y是否溢出: 原符号位
1
,新符号位1
,符号未变,不溢出。
- 计算 (x/2) + (2y):
22H + B8H
0010 0010 (22H)+ 1011 1000 (B8H)-----------1101 1010
- 结果 =
1101 1010
=DAH
。
- 判断最终结果是否溢出 (OF):
- 一个正数
(x/2)
加上一个负数(2y)
,永远不会发生溢出。 - 所以 OF = 0。
- 一个正数
- 计算 x/2:
- 结论: 机器数为DAH,OF=0。
24. 某8位计算机中,x和y是两个有符号整数,用补码表示,[x]补=44H,[y]补=DCH,则x-2y的机器数及相应的标志OF分别为( A )。
正确答案:A
题目解析
- 考点分析: 本题与上一题类似,是移位、减法和溢出的综合计算。
- 计算过程:
- 计算 2y:
- 同上题,
2y
的补码是B8H
,不溢出。
- 同上题,
- 计算 x - 2y:
- 即
[x]_补 + [-2y]_补
。 [x]_补 = 44H
。[2y]_补 = B8H
。- 求
[-2y]_补
:对B8H
变号(取反加1)。B8H = 1011 1000
- 取反:
0100 0111
- 加1:
0100 1000
=48H
。
- 计算
44H + 48H
:
0100 0100 (44H)+ 0100 1000 (48H)-----------1000 1100
- 结果 =
1000 1100
=8CH
。
- 即
- 判断最终结果是否溢出 (OF):
- 方法1(十进制):
x = +68
y = -36
->2y = -72
->-2y = +72
x - 2y = 68 + 72 = 140
。140
超出了8位有符号数的最大值+127
,发生正溢出。所以 OF = 1。
- 方法2(符号位):
x
是正数,-2y
也是正数。- 两个正数相加,结果
8CH
的符号位是1
(负数)。 - 正数+正数=负数,溢出。所以 OF = 1。
- 方法1(十进制):
- 计算 2y:
- 结论: 机器数为8CH,OF=1。
25. 某C语言代码段如下:…最终的输出结果是( A )。
题目原文
25. 某C语言代码段如下:
int si = -65536;
unsigned short i;
i = si;
if(i == j-1) printf("王道");
else printf("计算机教育");
当上述代码段执行到if分支条件判断时,根据标准寄存器中的( )决定执行顺序。最终的输出结果是( )。
[题目被拆分,这里只问第二个空]
题目原文(聚焦第二问):
25. …最终的输出结果是( )。
A. CF,王道
B. CF,计算机教育
C. OF,王道
D. OF,计算机教育
正确答案:A
题目解析
- 考点分析: 本题考察不同位宽、有符号数与无符号数之间的赋值(类型转换)以及C语言中比较运算的底层实现。
- 分析过程:
- 分析变量赋值:
int si = -65536;
-65536
的32位补码表示是1111 1111 1111 1111 0000 0000 0000 0000
(二进制),即FFFF0000H
。
unsigned short i;
i
是16位无符号数。i = si;
- 这是一个将32位
int
赋值给16位unsigned short
的操作,会发生截断,只保留低16位。 i
的值 =FFFF0000H
的低16位 =0000H
=0
(十进制)。
- 这是一个将32位
- 分析
j
的值 (题目未给出j的定义,这是一个缺陷,我们假设unsigned short j; j = 0;
)- 【关键点/假设】 题目中
if(i == j-1)
有j
,但j
未定义。这是一个严重的题目错误。我们只能从选项反推。 - 如果输出“王道”,意味着
i == j-1
为真。 - 我们已经算出
i = 0
。 - 所以
0 == j-1
->j = 1
。 - 我们假设
unsigned short j=1;
。
- 【关键点/假设】 题目中
- 分析比较
i == j-1
:i = 0
(unsigned short)j = 1
(unsigned short)j-1 = 0
。0 == 0
为真。- 【第一空】比较操作的底层实现:
cmp i, (j-1)
,cmp
指令会影响标志位,后续的je
(跳转)指令会根据ZF
标志位判断。但题目选项给的是CF
和OF
。这又是题目设计的一个问题。==
的判断依赖ZF
。
- 重新审视
i=si
: 如果int
是16位的(在一些旧系统中),那么si=-65536
会溢出。但通常int
是32位。 - 让我们尝试另一种对
j
的假设,也许j
是unsigned int j=1
?i
是unsigned short
,j
是unsigned int
。- 在比较
i == j-1
时,i
会被类型提升为unsigned int
。 i=0
,j=1
,j-1=0
。0==0
仍然为真。
- 分析变量赋值:
- 结论: 尽管题目存在
j
未定义和第一空选项不匹配的严重问题,但从i=si
的截断结果i=0
来看,要使条件为真,j
必须为1。在这种情况下,输出是“王道”。 - 第一空的答案是
CF
。cmp
指令会影响CF
,但==
判断不直接用CF
。这表明题目设计非常不严谨。
26. 【2009统考真题】…执行赋值语句z=x+y后,x,y,z的值分别是( D )。
题目原文
26. 【2009统考真题】一个C语言程序在一台32位机器上运行。程序中定义了三个变量x, y, z,其中x和z为int型,y为short型。当x=127,y=-9时,执行赋值语句z=x+y后,x,y,z的值分别是( )。
A. x=0000007FH, y=FFF9H, z=00000076H
B. x=0000007FH, y=FFF9H, z=FFFFFF76H
C. x=0000007FH, y=FFF7H, z=00000076H
D. x=0000007FH, y=FFF7H, z=FFFFFF76H
正确答案:D
题目解析
- 考点分析: 本题考察C语言中的类型提升(Integer Promotion) 和补码加法。
- 分析过程:
- 分析 x 的值:
x
是int
(32位),x = 127
。127
(十进制) =7FH
(十六进制)。- 32位表示为
0000007FH
。
- 分析 y 的值:
y
是short
(16位),y = -9
。- 求-9的16位补码:
+9
:0000 0000 0000 1001
- 取反:
1111 1111 1111 0110
- 加1:
1111 1111 1111 0111
=FFF7H
。
- 分析 z = x + y:
- 在C语言中,当不同长度的整型进行运算时,较短的类型会被提升到较长的类型。
short
型的y
会被提升为int
型,然后再与x
相加。- 类型提升规则: 提升时要保持其值不变。对于负数补码,需要进行符号扩展(Sign Extension)。
y = FFF7H
(16位),符号位是1。- 符号扩展到32位,高16位全部用符号位
1
填充:FFFFFFF7H
。
- 执行加法:
z = 0000007FH + FFFFFFF7H
00000000 00000000 00000000 01111111+ 11111111 11111111 11111111 11110111---------------------------------------(1)11111111 11111111 11111111 01110110
- 舍去最高位进位,结果是
FFFFFF76H
。
- 分析 x 的值:
- 结论: x=0000007FH, y=FFF7H, z=FFFFFF76H。
27. 【2010统考真题】…则下列运算会发生溢出的是( B )。
(该题与第11题几乎完全相同,只是数据不同)
题目原文
27. 【2010统考真题】假定有四个8位补码分别表示:r1=FEH, r2=F2H, r3=90H, r4=F8H, 若将运算结果存放在一个8位寄存器中,则下列运算会发生溢出的是( )。
A. r1+r2
B. r2×r3
C. r1×r4
D. r2-r4
正确答案:B
题目解析
- 考点分析: 本题考察8位补码运算的溢出判断。
- 分析过程(转换十进制):
r1 = FEH
=1111 1110
->-2
r2 = F2H
=1111 0010
->-14
r3 = 90H
=1001 0000
->-112
r4 = F8H
=1111 1000
->-8
- 逐项分析:
- A. r1+r2:
(-2) + (-14) = -16
。在-128~+127
范围内,不溢出。 - B. r2×r3:
(-14) * (-112) = +1568
。1568
远远超出了+127
,发生溢出。 - C. r1×r4:
(-2) * (-8) = +16
。在范围内,不溢出。 - D. r2-r4:
(-14) - (-8) = -14 + 8 = -6
。在范围内,不溢出。
- A. r1+r2:
- 结论: 运算
r2×r3
会发生溢出。
28. 【2013统考真题】…y的机器数为( A )。
题目原文
28. 【2013统考真题】某字长为8位的计算机中,x的机器数为1 1110100,y的机器数为1 0110000。若x,y均为补码,则x+2y的机器数为( );若x,y均为原码,则x+y的机器数为( )。
[题目被拆分,这里只问第二个空]
题目原文(聚焦第二问):
28. …若x,y均为原码,则x+y的机器数为( )。
A. 1 1000100
B. 0 0100100
C. 1 0101010
D. 溢出
正确答案:A
题目解析
- 考点分析: 本题考察原码加法的运算规则。
- 原码加法规则:
- 判断符号位。
- 同号: 绝对值相加,符号位不变。
- 异号: 绝对值大的减去绝对值小的,结果的符号与绝对值大的数相同。
- 分析过程:
- 解析x和y:
[x]_原 = 1 1110100
-> 符号1
(-), 绝对值1110100
(116
) ->x = -116
。[y]_原 = 1 0110000
-> 符号1
(-), 绝对值0110000
(48
) ->y = -48
。
- 执行x+y:
- 两个数是同号(都是负数)。
- 符号位: 结果的符号位为
1
。 - 绝对值: 两个数的绝对值相加。
1110100+ 0110000----------10100100
- 检查溢出: 7位绝对值相加,结果产生了8位,最高位有进位
1
,说明数值溢出。
- 解析x和y:
- 【答案校对与分析】 您提供的答案是
A (1 1000100)
。我的计算结果是10100100
。1110100
(116) +0110000
(48) =10100100
(164)。计算无误。- 选项A的值是
1000100
,十进制是68
。 - 结论: 此题的计算结果
10100100
与选项A1000100
不符,很可能是题目或选项印刷错误。如果x的绝对值是0010100
(20),y的绝对值是0110000
(48),相加为1000100
(68),则匹配。
29. 【2014统考真题】…发生溢出的是( C )。
题目原文
29. 【2014统考真题】若x=-103,y=25,则下列表达式采用8位定点补码运算实现时,会发生溢出的是( )。
A. x-y
B. x+y
C. -x-y
D. -x+y
正确答案:C
题目解析
- 考点分析: 本题考察8位补码运算的溢出判断。
- 8位补码范围:
-128 ~ +127
。 - 分析过程(十进制计算):
x = -103
,y = 25
-x = 103
,-y = -25
- A. x-y:
(-103) - 25 = -128
。结果为-128
,在表示范围内,不溢出。 - B. x+y:
(-103) + 25 = -78
。在范围内,不溢出。 - C. -x-y:
103 - 25 = 78
。【注意】 题目应为-(x+y)
或-x+y
? 还是-x
和-y
运算?- 如果理解为
(-x) - y
:103 - 25 = 78
。不溢出。 - 如果理解为
-(x-y)
:-(-128) = 128
。128
超出了+127
,发生溢出。 - 如果理解为
(-x) + (-y)
:103 + (-25) = 78
。不溢出。 - 如果理解为
- (x+y)
:- (-78) = 78
。不溢出。
- 如果理解为
- D. -x+y:
103 + 25 = 128
。128
超出了+127
,发生溢出。
- 【答案校对与分析】 您提供的答案是
C
。我的分析中D
会溢出。让我们重新看C
。- 如果
C
是-x-y
,即(-x) - y
,结果78
不溢出。 - 只有当表达式的最终结果超出
-128~+127
时才会溢出。 - 结论: 只有
D
选项(-x) + y
的结果128
明确溢出。答案C可能是题目印刷错误,应为D。或者C的表达式意为-(x-y)
。
- 如果
30. 【2018统考真题】…则x,y的值及x-y的机器数分别是( C )。
题目原文
30. 【2018统考真题】假定有符号整数x和y的机器数分别为FFFFDFDH和0000041H,则x,y的值及x-y的机器数分别是( )。
A. x=-65, y=65, x-y的机器数为FFFFFD9CH
B. x=-33, y=65, x-y的机器数为FFFFFD9CH
C. x=-65, y=65, x-y的机器数为FFFFFE9CH
D. x=-65, y=41, x-y的机器数为FFFFFE9CH
正确答案:C
题目解析
- 考点分析: 本题是补码转换、补码减法的综合计算题。
- 分析过程:
- 求 x 的值:
[x]_补 = FFFFDFDH
。这是一个负数。- 求其原码:符号位不变,数值位取反加1。
FFFFDFDH
->...1101 1111 1101
- 数值位
FFFDFD
取反:000202
。 - 加1:
000203H
。 203H = 2*16^2 + 0*16 + 3 = 512 + 3 = 515
。x = -515
。
- 【简便方法】
x = FFFFDFDH - FFFFFFFFH - 1 = FFFFDFDH - 100000000H
。 x = - (100000000H - FFFFDFDH) = - (203H) = -515
。- 【再检查】
x
的机器数是FFFFDFDH
? 不太可能。应该是FFFFFFDH
。 - 假设
[x]_补 = FFFFFFFDH
:x = - (100H - FDH) = -3
。
- 假设题目有误,按选项
x=-65
反推:-65
->+65
是41H
->0100 0001
- 取反
1011 1110
->BEH
- 加1
1011 1111
->BFH
。所以-65
的8位补码是BFH
。32位是FFFFFFBFH
。
- 求 y 的值:
[y]_补 = 00000041H
。正数,原码=补码。41H = 4*16 + 1 = 65
。所以y = 65
。这个是确定的。
- 计算 x-y:
- 假设
x=-65
,y=65
。 x - y = -65 - 65 = -130
。
- 假设
- 求 -130 的32位补码:
+130
=82H
=1000 0010
。- 32位原码:
0000....1000 0010
- 32位反码:
FFFF....0111 1101
(FFFFFF7DH
) - 32位补码:
FFFFFF7EH
。
- 求 x 的值:
- 【结论/综合分析】
- y的值
65
是确定的。可以排除D。 - x的值从机器码
FFFFDFDH
算出来是-515
。但选项都说是-65
或-33
。这表明题目的x机器码印刷错误。 - 我们只能采信选项给出的十进制值来做。
x = -65
,y = 65
。x - y = -130
。-130
的32位补码是FFFFFF7EH
。- 然而,选项给出的机器数是
FFFFFD9CH
或FFFFFE9CH
。 FFFFFE9CH
->-(100000000H - FFFFFE9CH) = -(164H) = -(1*256+6*16+4) = -(256+96+4) = -356
。- 这道题从头到尾数据都是混乱的,无法通过任何一种逻辑推导出答案C。 这是一个典型的坏题。
- y的值
31. 【2018统考真题】整数x的机器数为1101 1000,分别对x进行逻辑右移1位和算术右移1位操作,得到的机器数各是( B )。
题目原文
31. 【2018统考真题】整数x的机器数为1101 1000,分别对x进行逻辑右移1位和算术右移1位操作,得到的机器数各是( )。
A. 1110 1100、1110 1100
B. 0110 1100、1110 1100
C. 1110 1100、0110 1100
D. 0110 1100、0110 1100
正确答案:B
题目解析
- 考点分析: 本题考察逻辑右移和算术右移两种操作的规则区别。
- 分析过程:
- 原始机器数:
1101 1000
- 计算逻辑右移 (Logical Shift Right) 1位:
- 规则: 所有位向右移动一位,高位(左侧)固定补0,低位移出丢弃。
1101 1000
LSR 1 ->0110 1100
。
- 计算算术右移 (Arithmetic Shift Right) 1位:
- 规则: 所有位向右移动一位,高位(左侧)用原始符号位填充,低位移出丢弃。
- 原始符号位(最高位)是
1
。 1101 1000
ASR 1 ->1110 1100
。
- 原始机器数:
- 结论: 逻辑右移结果是
0110 1100
,算术右移结果是1110 1100
。
32. 【2018统考真题】指令“sub R1, R2, R3”的功能为(R2)-(R3)→R1…若(R1)=FFFFFFF0H,则该指令执行后CF和OF分别为( A )。
题目原文
32. 【2018统考真题】指令“sub R1, R2, R3”的功能为(R2)-(R3)→R1,该指令执行后将生成进位/借位标志CF和溢出标志OF。若(R1)=FFFFFFF0H,(R2)=FFFFFFFFH,该指令执行后CF和OF分别为( )。
[题干有误,R2, R3的值未给全。根据选项和答案反推,R3=FFFFFFF0H]
题目原文(修正):
32. …若(R2)=FFFFFFFFH, (R3)=FFFFFFF0H,则该指令执行后CF和OF分别为( )。
A. CF=0, OF=0
B. CF=0, OF=1
C. CF=1, OF=0
D. CF=1, OF=1
正确答案:A
题目解析
- 考点分析: 本题考察32位补码减法及其对CF和OF标志位的影响。
- 分析过程:
- 确定操作数的值:
(R2) = FFFFFFFFH
。这是-1的32位补码。(R3) = FFFFFFF0H
。这是-16的32位补码。
- 执行减法(十进制):
(R2) - (R3) = (-1) - (-16) = -1 + 16 = +15
。
- 执行减法(二进制补码):
R2 + (-R3)_补
(-R3)_补
= 对FFFFFFF0H
变号(取反加1)。FFFFFFF0H
取反 ->0000000FH
- 加1 ->
00000010H
(+16
)
FFFFFFFFH + 00000010H
...1111 1111+ ...0001 0000-------------(1)...0000 1111
- 结果是
0000000FH
,即+15
。
- 判断标志位:
- OF (Overflow Flag):
- 一个负数
(-1)
减去一个负数(-16)
。 - 结果
+15
是正数。 - 符号位从
1
变成了0
。 - 负数减负数,结果的符号可能为正也可能为负,不会发生溢出。
- 所以 OF = 0。
- 一个负数
- CF (Carry Flag):
- 对于减法
A-B
,CF=0
表示无借位 (A≥B),CF=1
表示有借位 (A<B)。 - 这是无符号数的比较。
A = FFFFFFFFH
(最大的无符号数)B = FFFFFFF0H
(一个很大的无符号数)- 显然
A > B
,所以没有发生借位。 - 因此,CF = 0。
- 对于减法
- OF (Overflow Flag):
- 确定操作数的值:
- 结论: CF=0, OF=0。
33. 【2023统考真题】已知x和y为int类型,…若执行“x减y”指令后得到的OF和CF分别为( B )。
题目原文
33. 【2023统考真题】已知x和y为int类型,x=100, y=200时,执行“x减y”指令后得到的OF和CF分别为( )。
A. OF=0, CF=0
B. OF=0, CF=1
C. OF=1, CF=0
D. OF=1, CF=1
正确答案:B
题目解析
- 考点分析: 本题与上一题类似,考察补码减法和标志位。
- 分析过程(假设int为32位):
- 执行减法(十进制):
x - y = 100 - 200 = -100
。
- 判断OF (Overflow Flag):
- 一个正数
(100)
减去一个正数(200)
。 - 结果
-100
是负数。 - 正数减正数,结果可能是正也可能是负,永远不会发生溢出。
- 所以 OF = 0。
- 一个正数
- 判断CF (Carry Flag):
CF
在减法中表示借位,是基于无符号数运算的。x = 100
,y = 200
。- 作为无符号数,
100 < 200
。 - 一个小(无符号)数减去一个大(无符号)数,必然会发生借位。
- 因此,CF = 1。
- 执行减法(十进制):
- 结论: OF=0, CF=1。
34. 【2024统考真题】C语言代码段如下,执行该代码段后,j的值是( B )。
int i=32777;
short si=i;
int j=si;
正确答案:B
题目解析
- 考点分析: 本题考察C语言中不同位宽、有符号整数之间的赋值(类型转换)和截断、符号扩展。
- 分析过程(假设short为16位,int为32位):
int i=32777;
32777
(十进制)。short
(16位有符号) 的最大值是2^15 - 1 = 32767
。32777
已经超出了16位有符号数的表示范围。32777
的16位二进制表示是1000 0000 0000 1001
(8009H
)。i
是int
(32位),可以正常存放32777
。i = 00000000 00000000 10000000 00001001
(00008009H
)。
short si=i;
- 这是一个从32位
int
到16位short
的赋值,会发生截断,只保留i
的低16位。 si
的值 =8009H
=1000 0000 0000 1001
(二进制)。
- 这是一个从32位
int j=si;
- 这是一个从16位
short
到32位int
的赋值,会发生类型提升。 - 由于
si
是有符号类型 (short
),提升时要进行符号扩展 (Sign Extension)。 si
的值为1000 0000 0000 1001
,其符号位(最高位)是1
。- 符号扩展到32位,高16位全部用符号位
1
填充。 j
的值 =1111 1111 1111 1111 1000 0000 0000 1001
(二进制) =FFFF8009H
。
- 这是一个从16位
- 将
j
的补码值转换为十进制:- 这是一个负数。
- 求其绝对值:取反加1。
FFFF8009H
- 取反:
00007FF6H
- 加1:
00007FF7H
7FF7H = 7*16^3 + 15*16^2 + 15*16 + 7 = 7*4096 + 15*256 + 240 + 7 = 28672 + 3840 + 240 + 7 = 32759
。- 所以
j = -32759
。
- 结论: j的值是 -32759。
35. 【2024统考真题】下列关于整数乘法运算的叙述中,错误的是( D )。
题目原文
35. 【2024统考真题】下列关于整数乘法运算的叙述中,错误的是( )。
A. 用阵列乘法器实现的乘运算可以在一个时钟周期内完成
B. 用ALU和移位器实现的乘运算在一个时钟周期内完成
C. 变量与常数的乘运算可编译优化为若干移位及加/减运算指令
D. 两个变量的乘运算无法编译转换为移位及加法指令的循环实现
正确答案:D
题目解析
- 考点分析: 本题考察整数乘法的多种硬件和软件实现方式。
- 错误选项分析 (D. 两个变量的乘运算无法编译转换为移位及加法指令的循环实现):
- 这个说法是错误的。
- “移位-加法” 是实现乘法的经典算法,也是早期没有硬件乘法器的CPU实现乘法的方式。
- 其原理模仿了二进制的笔算乘法:
A * B
。检查B
的每一位,如果该位是1,就将A
左移相应的位数后累加到结果中。 - 这个过程完全可以由编译器生成一个循环,循环体内包含移位和加法指令来实现。
- 正确选项分析:
- A: 阵列乘法器是一种纯组合逻辑电路,理论上可以在一个足够长的时钟周期内完成乘法。正确。
- B: 【注意】 这句话是错误的。用ALU和移位器实现的乘法,就是上述的“移位-加法”算法,它需要一个循环,必然要占用多个时钟周期。【答案校对】 您提供的答案是
D
。这意味着选项B被认为是正确的。这可能是对“一个时钟周期”的理解有偏差,或者题目本身不严谨。在单周期CPU模型下,可以认为乘法在一个周期内完成,但这是以极长的时钟周期为代价的。 - C: 正确。例如
x * 10
可以优化为x * (8+2)
->(x << 3) + (x << 1)
。这是一种常见的编译器优化。
2.2 定点数的运算 知识体系与考法总结
这一小节是整个“数据的表示与运算”章节的核心与难点。它不仅要求掌握二进制数的表示(原码、反码、补码),更要求能够亲手进行各种运算(加、减、乘、除、移位),并精确判断运算结果带来的标志位(CF, OF, SF, ZF)变化。这部分内容计算性强,细节繁多,是考试中区分度最高的区域之一。
知识体系梳理
本节的知识体系可以围绕“两大基础运算”、“两大高级运算”和“一个核心机制”来构建。
一、 两大基础运算:加减法与移位
-
补码加减法 (核心中的核心):
- 加法规则:
[x+y]_补 = [x]_补 + [y]_补
(模2^n)。符号位与数值位一同参与运算。 - 减法规则:
[x-y]_补 = [x]_补 + [-y]_补
。减法转换为加法。 - 求 [-y]_补: 对
[y]_补
连同符号位在内,各位取反,末位加1。
- 加法规则:
-
移位运算 (高频考点):
- 逻辑移位 (Logical Shift):
- 用于无符号数。
- 左移 (LSL): 高位移出,低位补0。相当于
*2
。 - 右移 (LSR): 低位移出,高位补0。相当于
/2
。
- 算术移位 (Arithmetic Shift):
- 用于有符号数(补码)。
- 左移 (ASL): 与逻辑左移操作相同(高位出,低位补0)。相当于
*2
。 - 右移 (ASR): 低位移出,高位用原始符号位填充。相当于
/2
(向下取整)。
- 循环移位 (Circular Shift):
- 不带进位 (ROL/ROR): 移出的位从另一端移入。
- 带进位 (RCL/RCR): 移出的位进入
CF
标志,原CF
标志的值从另一端移入。
- 逻辑移位 (Logical Shift):
二、 两大高级运算:乘法与除法
-
原码乘法 (一位乘):
- 规则: 符号位单独异或处理;数值位(绝对值)进行“移位-加法”的无符号乘法。
- 特点: 简单直观,但需要处理符号位和数值位,硬件实现相对独立。
-
补码乘法 (Booth算法):
- 规则: 符号位与数值位一同参与运算,根据乘数的相邻两位来决定是
+X
,-X
还是0
。 - 特点: 避免了对负数的特殊处理,硬件实现更规整。
- 规则: 符号位与数值位一同参与运算,根据乘数的相邻两位来决定是
-
原码除法 (恢复余数法 / 加减交替法):
- 规则: 符号位单独异或;数值位进行“比较-上商-减-移位”的循环。
- 恢复余数法: 余数为负时,需要“恢复”余数。
- 加减交替法(不恢复余数法): 通过后续的“加”操作来补偿,效率更高。
三、 一个核心机制:溢出判断与标志位
这是所有运算题必考的内容,是衡量运算结果正确性的关键。
-
溢出 (Overflow):
- 定义: 运算结果超出了机器数所能表示的范围。
- 根本原因: 机器字长(运算器位数)有限。
- 溢出标志 (OF): 用于有符号数运算。
OF=1
表示溢出。 - 进/借位标志 (CF): 用于无符号数运算。
CF=1
表示溢出(加法上溢,减法下溢)。
-
OF的判断方法 (必考):
- 方法一(单符号位):
OF = C_s XOR C_x
(符号位的进位与最高数值位的进位不同)。 - 方法二(双符号位/变形补码):
OF = S_f1 XOR S_f2
(两个符号位不同)。01
为正溢出,10
为负溢出。 - 方法三(符号逻辑): 两个正数相加得负数;两个负数相加得正数;正数减负数得负数;负数减正数得正数。
- 方法一(单符号位):
-
其他标志位 (Flags):
- ZF (Zero Flag): 结果是否为0。
- SF (Sign Flag): 结果的符号位。
- PF (Parity Flag): 结果中1的个数是否为偶数。
- AF (Auxiliary Carry Flag): BCD码运算时,低4位向高4位的进位。
-
C语言中的类型转换:
- 截断: 长数据赋给短数据,高位被丢弃。
- 类型提升: 短数据与长数据运算,短数据会被提升。有符号数进行符号扩展,无符号数进行零扩展。
常见考法与例题梳理
-
基础运算与标志位计算(高频核心)
- 考法: 给出两个操作数的机器码(通常是补码),要求执行加/减法,并判断OF和CF。
- 例题01, 02, 32, 33 (真题): 都是该考法的直接体现。解题关键:
- 精确执行二进制补码加/减运算(减法转加法)。
- 分别用有符号和无符号的观点来判断OF和CF。OF看符号,CF看进/借位。
- 例题11, 27 (真题): 考察乘法溢出,通常通过将补码转为十进制判断更简单。
-
移位运算(高频)
- 考法: 给出机器数,要求进行逻辑/算术移位,并得出结果。
- 例题04, 06, 08, 31 (真题): 集中考察了算术右移(高位补符号位)和逻辑右移(高位补0)的区别,这是最常见的考点。
-
溢出判断方法的综合应用
- 考法:
- 给出溢出的逻辑条件(如双符号位、双进位)。
- 给出几个数,判断哪个进行算术左移会溢出。
- 例题09, 13, 14, 15, 16: 全面考察了溢出判断的各种硬件实现方法和逻辑条件。核心是
OF = C_s XOR C_x
和OF = S_f1 XOR S_f2
。算术左移溢出的判断条件是X0 != X1
。
- 考法:
-
C语言与机器级运算的结合
- 考法: 给出一段简单的C代码,涉及不同类型整数的运算或赋值,要求分析其底层的机器数变化或最终结果。
- 例题26 (2009真题): 考察了
short
到int
的类型提升和符号扩展。 - 例题34 (2024真题): 考察了
int
到short
的截断和short
到int
的符号扩展。
-
加法器实现减法
- 考法: 考察
x-y
在加法器中是如何通过x + (y的反码) + C_in=1
来实现的。 - 例题21, 22: 是该考法的典型题目,要求确定加法器的三个输入。
- 考法: 考察
刻意练习建议
-
制作“标志位速查表”:
- 创建一个表格,行为
ADD
,SUB
,AND
,OR
,XOR
,ASL
,ASR
,LSL
,LSR
等指令。 - 列为
CF
,OF
,SF
,ZF
。 - 在表格中填写每条指令对每个标志位的影响规则。例如,
ADD/SUB
影响所有四个;AND/OR/XOR
影响SF, ZF, PF,但通常会清零CF和OF;移位指令对CF
有特殊影响(移入移出的位)。这张表能帮你系统记忆。
- 创建一个表格,行为
-
溢出判断专项训练:
- 找10-15道加减法题。
- 对于每一道题,都用三种方法来判断OF:①十进制法;②符号逻辑法;③双进位法。
- 通过多种方法相互验证,可以加深对溢出本质的理解,并找到自己最熟练、最不容易出错的方法。
-
“移位”规则对比练习:
- 拿一个正数补码和一个负数补码作为例子。
- 分别对它们进行算术左移、算术右移、逻辑左移、逻辑右移、循环左移、循环右移,并写出每种情况的结果。
- 这种对比练习能让你清晰地记住六种移位操作的规则差异。
-
C语言类型转换模拟:
- 自己编写简单的C程序,包含
int a; short b; unsigned int c; unsigned short d;
等变量。 - 编写各种相互赋值和运算的语句,如
b=a; c=b; d=a; a=c+d;
。 - 先在纸上手动模拟截断和符号/零扩展,预测结果。
- 然后上机编译运行,用
printf("%d, %u, %x\n", ...)
打印出结果的十进制、无符号和十六进制形式,与自己的预测进行对比,找出理解偏差。
- 自己编写简单的C程序,包含
通过对这些核心运算规则的系统梳理和大量针对性的计算练习,你将能够攻克定点数运算这一难点,并为理解CPU的ALU设计和程序执行打下坚实的基础。