Appearance
题目
整数 x 的机器数为 11011000,分别对 x 进行逻辑右移 1 位和算术右移 1 位操作,得到的机器数各是( )。
错因
A
把"逻辑右移"也按"算术右移"处理——高位补符号位 1。但逻辑右移高位永远补 0,与符号位无关。错的本质是没把"逻辑/算术"两种移位区分开。
C
顺序反了——把算术右移结果当成了逻辑右移结果,反之亦然。看到题面"分别对 x 进行逻辑右移和算术右移"要按顺序对应输出。
D
把"算术右移"也按"逻辑右移"处理——高位补 0。但算术右移高位补符号位(本题符号位 = 1,补 1),目的是保持有符号数移位前后的真值近似除以 2。
总解析
两种右移规则:
| 移位类型 | 高位补什么 | 适用于 |
|---|---|---|
| 逻辑右移(≫) | 永远补 0 | 无符号数;当作纯位串处理 |
| 算术右移(≫) | 补符号位(最高位的当前值) | 有符号数;保持除以 2 的语义 |
第一步:逻辑右移 1 位
x = 1101 1000,所有位向右挪 1 位,最高位补 0:
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| x 原 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
| 逻辑右移 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
结果 = 0110 1100。
第二步:算术右移 1 位
x = 1101 1000,符号位 = 1,所有位向右挪 1 位,最高位补 1(符号位的值):
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| x 原 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
| 算术右移 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
结果 = 1110 1100。
汇总:逻辑右移 = 0110 1100,算术右移 = 1110 1100。
最终答案是 B。
真值验证(用 8 位补码看意义):
x = 1101 1000 是负数(最高位 1)。:取反 0010 0111 + 1 = 0010 1000 = 0x28 = 40 → x = −40。
| 操作 | 结果机器数 | 当作有符号数读 | 是否 = x ÷ 2 |
|---|---|---|---|
| 算术右移 1 位 | 1110 1100 | -20 | ✓ −40 ÷ 2 = −20 |
| 逻辑右移 1 位 | 0110 1100 | +108 | ✗ 把负数当无符号数处理 |
算术右移保持了"除以 2"的真值语义;逻辑右移则把符号位当普通位移走,对负数会得到完全不同的真值。
易错点速查:
| 移位 | 高位 | 何时用 |
|---|---|---|
| 算术左移 | 低位补 0 | × 2(与逻辑左移结果相同) |
| 逻辑左移 | 低位补 0 | 同上 |
| 算术右移 | 高位补符号位 | ÷ 2(保持有符号语义) |
| 逻辑右移 | 高位补 0 | 无符号位串处理 |
记忆口诀:算术守符号,逻辑只补零。