本文系統講解計算機中原碼、反碼、補碼的表示方法、轉換規則,並深入探討為何現代計算機採用補碼表示有符號整數。通過模運算與同餘理論,從數學本質證明補碼將減法轉為加法的正確性,幫助讀者建立扎實的計算機組成原理基礎。
數值在計算機中的二進制表示形式稱為機器數。最高位為符號位:0 表示正,1 表示負。假設字長 8 位:
+3 → 00000011 -3 → 10000011
這兩個二進制串即為機器數。
因符號位存在,機器數的形式值(按無符號整數理解)不等於真實數值。例如 10000011 形式值為 131,但真值為 -3。帶符號位的機器數對應的真實數值,稱為該機器數的真值。
0000 0001 真值 = +1 1000 0001 真值 = -1
符號位 + 真值絕對值。8 位二進制範圍:[-127, +127](11111111 至 01111111)。最符合人類直覺。
[+1]原 = 0000 0001 [-1]原 = 1000 0001
[+1]反 = 0000 0001 [-1]反 = 1111 1110
[+1]補 = 0000 0001 [-1]補 = 1111 1111
原碼雖直觀,但符號位參與運算時減法結果錯誤:
1 - 1 = 1 + (-1) [00000001]原 + [10000001]原 = [10000010]原 = -2 ❌
反碼 解決了減法運算,但引入 +0 與 -0 兩種編碼:
[00000001]反 + [11111110]反 = [11111111]反 = [10000000]原 = -0 ❌
補碼 完美修復:
[00000001]補 + [11111111]補 = [00000000]補 = 0 ✅ 原 -0 編碼 [10000000] 如今表示 -128,擴展範圍至 [-128, +127]
這就是 32 位 int 範圍為 [-2³¹, 2³¹-1] 的原因。
12 小時制時鐘:當前 6 點,欲調至 4 點。
撥回 2 小時(減法) ≡ 撥前 10 小時(加法) ≡ 撥前 22 小時。
(6 - 2) mod 12 = (6 + 10) mod 12 = 4
整數 a, b 若對模 m 同餘,記作 a ≡ b (mod m),即 a mod m = b mod m。
負數取模規則:x mod y = x - y × ⌊x/y⌋(向下取整)。
例:-3 mod 2 = -3 - 2×(-2) = 1。

反碼本質:8 位二進制下,模數為 2⁷-1 = 127。
-1 ≡ 126 (mod 127),故 2 - 1 ≡ 2 + 126 (mod 127),結果余數為 1。
符號位參與運算,恰好利用溢出實現模運算。
補碼本質:模數為 2⁷ = 128。
-1 ≡ 127 (mod 128),故 2 - 1 ≡ 2 + 127 (mod 128)。
補碼在反碼基礎上 +1,相當於將模數從 127 增至 128,消除雙零問題,並多表示一個最小值 -128。
注意:-128 無原碼/反碼表示,其補碼 10000000 按原碼規則解碼為 00000000(錯誤)。
理解同餘與模運算,是看透補碼本質的鑰匙。
出處:https://www.cnblogs.com/zhangziqiu/