Appearance
题目
由 3 个"1"和 5 个"0"组成的 8 位二进制补码,能表示的最小整数( )。
错因
A
补码 -126 对应的位模式是 10000010——里面只有 2 个 1(符号位 1 + 第 1 位 1),不满足"3 个 1"的约束。错答的人多半没回头核对位串里 1 的个数,只挑了"第二小的负数"就交卷。
C
把 3 个 1 都堆在了高位——11100000 确实满足 3 个 1 + 5 个 0,对应真值 −32。但这样补码作为无符号读是 224(很大),对应真值偏向 0;要让负数最小(最负),应该让补码无符号值最小——也就是把多余的 1 尽量往低位放。挑 C 的人方向恰好搞反了。
D
完全是读题错——把"3 个 1 和 5 个 0 组成"误解成"数值是 3",然后加个负号写了 −3。−3 的补码是 11111101,里面有 7 个 1、1 个 0,根本不符合题面约束。
总解析
核心思路:负数补码作为无符号位串读时,值越小,对应真值越负。所以"最小整数"等价于"在 3 个 1 + 5 个 0 的位串中,符号位是 1 的前提下,剩下 7 位组成的无符号数最小"。
第一步:固定符号位
要表示负数,最高位(符号位)必须为 1——这一步就用掉了 3 个 1 中的 1 个。剩下 7 位上要安排 2 个 1 + 5 个 0。
第二步:让剩下 7 位组成的二进制数最小
7 位上 2 个 1 + 5 个 0,要数值最小 → 把 2 个 1 都放在最右两位(权值最小的位):
第三步:把这个补码翻译回真值
补码 → 真值的两种等价方法:
方法一(按位权展开):
方法二(取反加 1 法):
| 步骤 | 结果 |
|---|---|
| 原补码 | 10000011 |
| 各位取反(含符号位) | 01111100 |
| +1 | 01111101 = 125 |
| 加符号 | −125 |
第四步:验证一下其他放法都更大(即更接近 0)
| 位串 | 含 1 个数 | 真值 |
|---|---|---|
10000011 | 3 ✓ | −125(最小) |
10000101 | 3 ✓ | −123 |
10000110 | 3 ✓ | −122 |
10001001 | 3 ✓ | −119 |
11100000 | 3 ✓ | −32(C 选项,明显更大) |
把 1 越往左挪,补码无符号值越大,真值越接近 0。
最终答案是 B(−125)。
关键易错点:
- "由 3 个 1 和 5 个 0 组成"是位模式约束,不是数值约束,不要把 3 当成数值
- 补码负数找"最小"= 找符号位为 1 时无符号读最小的位串 → 多余的 1 往最右放
- 别忘了符号位本身就占了 1 个 1