3.4 · 二的補碼
目標: 把任意整數轉成 n 位二的補碼形式,再轉回去。
負數的問題
二進制只有 0 與 1 —— 沒有 − 號。電腦怎麼儲存負整數?
歷史上有三種方案:
| 方案 | 思想 | 缺點 |
|---|---|---|
| Sign-magnitude 符號-絕對值 | 最左位作符號(0 = +,1 = −),其餘是絕對值 | 有兩個零(+0、−0);減法尷尬 |
| One's complement 一的補碼 | 全部位反轉表示負 | 仍有兩個零;進位處理亂 |
| Two's complement 二的補碼 | 全部反轉,再加 1 | 單一零;加減統一處理 |
現代電腦全部用二的補碼表示有符號整數。HKEAA 明確要求你掌握。
怎麼編碼一個負整數
3 步配方
要在 n 位二的補碼錶示 −x:
- 把
+x寫成 n 位二進制。 - 每位反轉(一的補碼)。
- 加 1。
例 · 8 位下的 −5
| 步驟 | 過程 |
|---|---|
| 1. 寫 +5 | 0000 0101 |
| 2. 反轉 | 1111 1010 |
| 3. 加 1 | 1111 1011 |
所以 −5 = 1111 1011₂ 在 8 位二的補碼中。
例 · 8 位下的 −1
| 步驟 | 過程 |
|---|---|
| 1. 寫 +1 | 0000 0001 |
| 2. 反轉 | 1111 1110 |
| 3. 加 1 | 1111 1111 |
−1 就是全 1。(任何位數皆如此。)
例 · 8 位下的 −128
| 步驟 | 過程 |
|---|---|
| 1. 寫 +128 | 1000 0000(已是負數解讀,但位模式相同) |
| 2. 反轉 | 0111 1111 |
| 3. 加 1 | 1000 0000 |
位模式 1000 0000 在二的補碼中表示 −128 —— 8 位有符號最小值。
怎麼解碼二的補碼數字
如果 MSB 為 0 → 是正數;按普通二進制讀。
如果 MSB 為 1 → 是負數。兩種換算:
方法 1 · 套同樣的配方(對稱!)
1111 1011₂ → 反轉 → 0000 0100 → +1 → 0000 0101 = 5 → 所以原值為 −5。
方法 2 · 用負的 MSB 位值
對 n 位二的補碼,MSB 的位值是 −2ⁿ⁻¹ 而不是 +2ⁿ⁻¹。
8 位時:
| 位 | −128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| 位元 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
值 = −128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = −5。✓
n 位二的補碼範圍
| 位數 | 範圍 |
|---|---|
| 4 | −8 到 +7 |
| 8 | −128 到 +127 |
| 16 | −32,768 到 +32,767 |
| 32 | −2,147,483,648 到 +2,147,483,647 |
公式:n 位時,範圍為 −2ⁿ⁻¹ 到 +2ⁿ⁻¹ − 1。
注意不對稱:負值比正值多一個,因為 0 住在正的一側(0000 0000)。
二的補碼為何精彩
零隻有一種表示
符號-絕對值有 +0 和 −0。二的補碼只有 0000 0000 = 0。
減法即加法
A − B = A + (B 的二的補碼)。
同一套電路加正數和負數 —— 不用單獨減法器。
符號擴展自然成立
把 8 位有符號數複製到 16 位寄存器,只要把 MSB 複製到新增的上位即可:
8 位 −5 = 1111 1011
16 位 −5 = 1111 1111 1111 10112
實例
例 A · 4 位二的補碼下算 7 − 3
+7 = 0111+3 = 0011,所以 −3 = 0011 → 1100 → 1101。
相加:0111 + 1101 = 1 0100。丟棄 MSB 進位 → 0100 = +4。✓
例 B · 8 位二的補碼下算 5 − 9
+5 = 0000 0101−9 = 0000 1001 → 1111 0110 → 1111 0111
相加:0000 0101 + 1111 0111 = 1111 1100 = −4。✓
學生常見錯誤
- 忘了第 3 步(加 1) —— 這就是一的補碼與二的補碼的差別。
- 把 MSB = 1 當作永遠是負 —— 僅在二的補碼下成立;無符號二進制裏 MSB 只是普通位。
- 範圍不對稱 bug:試圖用 8 位有符號表示 +128(超界)。
- 混寬度 —— 比較 4 位有符號
1011與 8 位有符號1011會得到不同值。
練習活動
在 8 位二的補碼下求:
−1的位模式。−42的位模式。1110 0000的十進制值。1000 0000的十進制值。- 可表示值的範圍。
答案
1111 11111101 0110(+42 =0010 1010→ 反轉1101 0101→ +1 →1101 0110)−32−128−128到+127
考試式題目
題(4 分): 用 8 位二的補碼把
−45₁₀表為二進制,寫出過程。
參考答案:
| 步驟 | 過程 |
|---|---|
| 1. 寫 +45 為 8 位二進制 | 0010 1101 |
| 2. 每位反轉 | 1101 0010 |
| 3. 加 1 | 1101 0011 |
−45₁₀ = 1101 0011₂ 在 8 位二的補碼中。
關鍵要點
- 二的補碼 = 全部反轉,再加 1。
- 二的補碼數字的 MSB 位值是
−2ⁿ⁻¹。 - 零隻有一種表示。
- 加減法共用硬件。
- 範圍:
−2ⁿ⁻¹到+2ⁿ⁻¹ − 1。
➡️ 下一節:3.5 字符編碼