Appearance
题目
对机器数 1010 0110B 先执行算术右移 3 位,再执行算术左移 2 位,最终结果是( )。
错因
B
把"先右移 3 后左移 2"误当成"净位移 = 右移 1",直接对原数 1010 0110B 算术右移 1 位得到 1101 0011B。这种"加减抵消"的思路对逻辑右移和循环移位才成立——算术左移会把右移时补的符号位再"挤回去",从而丢失低位信息。本题先右移 3 位时把原数的低 3 位 110 永久挤出去了,再左移 2 位补的是 0,不可能再恢复成 011。
C
把算术右移当成了逻辑右移——算术右移要按符号位补(这里符号位是 1,所以高位补 1),而不是补 0。1010 0110B 算术右移 3 位应是 1111 0100B(高位补 3 个 1),错答把它算成 0001 0100B(高位补 0),再左移 2 位得到 0101 0000B。算术 vs 逻辑的关键区别就在"补符号位还是补 0"。
D
用了循环移位代替算术移位——把先右移 3 位再左移 2 位看成"净循环右移 1 位",把 1010 0110B 的最低位 0 转到最高位得到 0101 0011B。算术移位不会循环,挤出去的位直接丢弃;而且左移补的也是 0,不是循环回来的位。
总解析
前置概念——算术移位的补位规则:
| 移位方向 | 高位补什么 | 低位补什么 | 挤出位 |
|---|---|---|---|
| 算术右移 | 复制符号位(保持正负不变) | — | 直接丢弃 |
| 算术左移 | — | 补 0 | 直接丢弃 |
原数 1010 0110B,符号位为 1(表示负数)。
第一步:算术右移 3 位
每次右移高位补 1(符号位),低位 1 位被挤掉:
| 操作 | 结果 |
|---|---|
| 初始 | 1010 0110 |
| 右移 1 位 | 1101 0011 |
| 右移 2 位 | 1110 1001 |
| 右移 3 位 | 1111 0100 |
得到 1111 0100B。
第二步:算术左移 2 位
每次左移低位补 0,高位 1 位被挤掉:
| 操作 | 结果 |
|---|---|
| 初始 | 1111 0100 |
| 左移 1 位 | 1110 1000 |
| 左移 2 位 | 1101 0000 |
得到 1101 0000B。
验证(可选,按真值检查):
原数 1010 0110B 是补码 → 真值 。 算术右移 3 位 ≈ 真值 ÷ 8 = ,向负无穷取整为 −12,对应补码 1111 0100B ✓。 算术左移 2 位 = 真值 × 4 = ,对应补码 1101 0000B ✓(注意若结果超出补码可表示范围会溢出,本题未溢出)。
最终答案是 A(1101 0000B)。
易错点速查:
- 算术右移 ≠ 逻辑右移:前者高位补符号位,后者高位补 0
- 算术左右移不可逆:被挤出去的位丢失,先右后左 ≠ 净位移右 1
- 算术左移可能改变符号位(导致溢出),右移不会