用 n 个二进制位表示的带符号整数,通常采用**补码表示法**(这是现代计算机的标准)
📅 2026/7/27 7:46:59
👁️ 阅读次数
📝 编程学习
用 n 个二进制位表示的带符号整数,通常采用补码表示法(这是现代计算机的标准)。在补码中:
- 最高位(第 n 位,即最高位,索引为 n−1)是符号位:0 表示正数或零,1 表示负数;
- 可表示的整数范围是:
−2^(n−1) 到 2^(n−1) − 1(含两端); - 因此,最大值是 2^(n−1) − 1。
例如:
- n = 8 时,范围是 −128 到 +127,最大值为 127 = 2⁷ − 1;
- n = 4 时,范围是 −8 到 +7,最大值为 7 = 2³ − 1。
选项中 A 和 C 重复(均为 2^(n−1)),B 是 2^n(无符号最大值),D 是 2^(n−1)−1 —— 正确。
✅ 答案:D
因为在补码表示法中,0 被唯一地表示为全 0(如 8 位为00000000),不占用负数编码空间,且符号位参与数值计算,使得负数多出一个编码位置。
具体原因如下:
✅1. 0 只有一种表示
- 原码和反码中,+0 和 −0 是两种不同编码(如 8 位原码:
00000000和10000000),浪费了一个编码; - 补码中,
00000000表示 0,而10000000被定义为 −128(n=8 时),没有 −0 的冗余表示,从而“腾出”一个编码给负数。
✅2. 编码空间对称但偏移
n 位二进制共有 2ⁿ 个不同编码。补码将它们映射为连续整数:
- 编码
000...000→ 0 000...001→ +1- …
011...111→ +2^(n−1)−1(最大正数)100...000→ −2^(n−1)(最小负数,即“最负值”)111...111→ −1
可见:
- 正数个数:从 +1 到 +2^(n−1)−1 → 共 2^(n−1)−1 个
- 零:1 个
- 负数个数:从 −1 到 −2^(n−1) → 共 2^(n−1) 个
→ 负数比正数多一个(多出 −2^(n−1) 这个数)。
✅3. 数学本质:模运算一致性
补码本质是模 2ⁿ 运算下的等价类:
x 的补码 ≡ x (mod 2ⁿ),且约定在 [−2^(n−1), 2^(n−1)−1] 内取代表元。
该区间长度为 2ⁿ,且关于 0不对称(因 0 居左端+1位置),自然导致负数端多一个。
简言之:零占一位、无−0、模运算截断方式决定负数范围向下延伸一位。
编程学习
技术分享
实战经验