在有號整數的補碼表示中,+1 的二進制為 000...001,-1 卻是 111...111。這看似反直覺的設計,實則蘊含「模運算」與「硬體加法器統一」的精妙邏輯。
1 的原碼(8位為例) : 0 0000001
1 的反碼 : 1 1111110
1 的補碼 = 反碼 + 1 : 1 1111111 → 即 -1
同理,32 位 int 下:
+1 : 00000000 00000000 00000000 00000001
-1 : 11111111 11111111 11111111 11111111
A - B = A + (-B)。若 -B 用補碼表示,CPU 只需一組加法器即可完成加減法,無需額外減法電路。
n 位元系統下,數值範圍為 [-2^(n-1), 2^(n-1)-1]。補碼本質上是 模 2^n 的同餘類代表元:
-1 ≡ 2^n - 1 (mod 2^n)
= 111...111 (二進制)
因此 1 + (-1) = 1 + (2^n - 1) = 2^n ≡ 0 (mod 2^n),溢位捨棄後結果正確為 0。
111...111 >> 1 = 111...111 即 -1/2 = -1 向下取整)。int16_t -1 → int32_t 自動變 111...111。以 8 位為例,-128 的補碼為 10000000。其原碼需 9 位表示(1 10000000),故補碼系統多出一個負數,範圍非對稱:[-128, 127]。
-1 補碼全 1 不是巧合,而是模運算閉環與硬體電路極簡化的必然選擇。這個設計讓現代 CPU 能用同一組加法器、移位器處理有號/無號運算,是計算機體系結構中最優雅的工程決策之一。