Appearance
题目
某字长为 8 位的计算机中,已知整型变量 x、y 的机器数分别为 = 11110100, = 10110000。若整型变量 z = 2x + y/2,则 z 的机器数为( )。
错因
B
把符号丢了——可能是按"无符号数"或"原码"处理位串:把 误读成 +244、 误读成 +176,再做"乘 2/除 2"得到两个正数相加。结果落到正数区间,但题目里 x、y 都是负数(最高位是 1),加倍 / 减半后仍应是负数。关键判别:补码运算后最高位应保持负号才合理(两个负数相加结果还是负数)。
C
算术移位的方向 / 补位错了。 = 10110000 做算术右移时符号位(最高位)必须保留为 1,正确结果 11011000。如果做成"逻辑右移"(高位补 0)会得到 01011000;如果在 2x 的左移里没有处理好低位补 0、或在加法时进位算错,最终凑出 10101010 这种"看着像负数但具体值不对"的位串。建议用列竖式严格按位加。
D
误判 2x 溢出。判定 2x(算术左移 1 位)是否溢出的标准是:移位前最高两位是否相同—— = 11110100,最高两位都是 1(相同),所以左移不溢出。同理 y/2 是右移,永远不会溢出。再者 2x = −24 与 y/2 = −40 相加 = −64 ∈ [−128, 127],加法也未溢出。整道题没有任何溢出环节。
总解析
第一步:还原 x、y 的真值
| 机器数 | 二进制 | 真值 |
|---|---|---|
| 11110100 | ||
| 10110000 |
可以校验:、、,三者都在 8 位补码范围 内,不会溢出。
第二步:算 2x(算术左移 1 位)
= 11110100 → 左移 1 位、低位补 0:
校验:11101000 的真值 = ✓
溢出判定:左移前最高两位是 "11"(相同)→ 不溢出。
第三步:算 y/2(算术右移 1 位)
= 10110000 → 右移 1 位、高位补符号位 1:
校验:11011000 的真值 = ✓(与 −80/2 = −40 吻合)
第四步:补码加法
1 1 1 0 1 0 0 0 ([2x]补 = -24)
+ 1 1 0 1 1 0 0 0 ([y/2]补 = -40)
─────────────────
1 1 1 0 0 0 0 0 0 (第 9 位的进位舍弃)按位加(从低到高,标 ↑ 为进位):
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | |
| 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | |
| 进位入 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 和 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
去掉超出 8 位的最高进位 → 。
溢出判定:两个加数最高位都是 1(同号)、和的最高位也是 1(同号)→ 不溢出。
校验:11000000 的真值 = ✓
最终答案是 A(11000000)。
算术移位三条铁律:
- 算术左移:低位补 0;溢出条件 = 移位前最高两位不同
- 算术右移:高位补 符号位(正补 0、负补 1);不会溢出
- 加减法溢出判定:两加数同号、和异号 → 溢出