早期計算機嘗試用「符號位 + 絕對值」表示負數(原碼),但加減法需分正負、比較大小、處理 ±0 等邊界,電路極其複雜。補碼的出現,將減法轉為加法,讓單一加法器搞定所有整數運算。本文從數學本質推導補碼,證明其運算正確性,並解釋硬體實現優勢。
假設 4 位元系統,能表示 0~15(2^4)。若我們規定:
正數照常;負數
-x用16 - x表示。
則:
-1 → 15 (1111)-2 → 14 (1110)-7 → 9 (1001)這就是 模 16 的同餘類。任意 x + (-x) ≡ 0 (mod 16),溢出位自然丟棄,硬體只需一個 4 位加法器。
0 ~ 127(0x00 ~ 0x7F),最高位 0,與無符號數相同。-1 ~ -128 對應 128 ~ 255(0x80 ~ 0xFF),最高位 1。[-x]補 = (2^8 - x),等價於 原碼取反 + 1。
2^n - x?對任意 n 位數 x,按位取反得到 (2^n - 1) - x,再加 1 即 2^n - x。
唯一性證明:若 x + y ≡ 0 (mod 2^n) 且 0 ≤ y < 2^n,則 y 唯一,故補碼表示唯一,且 -0 = 0,無 ±0 問題。
設 x, y > 0,結果不溢出。用 [z] 表示 z 的補碼。
[x] + [y] = x + y 顯然正確。[x] + [-y]x = y + (x - y) ⇒ [x] + [-y] = [y + (x-y)] + [-y] = [y] + [x-y] + [-y] = [x-y] ✓x = y - (y - x) ⇒ [x] = [y] + [-(y-x)] ⇒ [x] + [-y] = [-(y-x)] ✓[-x] + [-y][-x] = [y] + [-(x+y)] ⇒ [-x] + [-y] = [-(x+y)] ✓
結論:同一加法器,無條件正確處理所有符號組合。
| 特性 | 原碼/反碼 | 補碼 |
|---|---|---|
| 零的表示 | +0 / -0 兩個 | 唯一 0x00 |
| 符號擴展 | 需特殊邏輯 | 直接複製符號位(算術右移) |
| 比較大小 | 需分符號位 | 無符號比較器即可(同序) |
| 溢出判斷 | 複雜 | 符號位進位 ≠ 最高位進位 → 溢出 |
-2^{n-1},負數最高位為 1 是權值使然,非單純標記。[x] ≡ x (mod 2^n)。補碼是 模 2^n 同餘系統 在計算機工程中的完美落地:以犧牲一個正數編碼(-128 無對應正數)為代價,換取統一加法器、唯一零值、簡單溢出判斷、符號擴展免費。這是計算機體系結構中「數學抽象指導工程實現」的教科書級範例。