計算機內部用二進制表示有符號整數,8 位元組(1 byte)有符號整數的範圍為 -128 ~ +127。這背後的關鍵在於補碼表示法。本文系統梳理原碼、反碼、補碼的定義、轉換規則,並解釋為什麼補碼能多表示一個數(-128),以及計算機為何統一採用補碼進行運算。
| 表示法 | 正數 | 負數 | 8位範圍 | 零的表示 |
|---|---|---|---|---|
| 原碼 | 符號位 0 + 絕對值 | 符號位 1 + 絕對值 | -127 ~ +127 | +0 (00000000)、-0 (10000000) 兩個 |
| 反碼 | 同原碼 | 符號位不變,數值位按位取反 | -127 ~ +127 | +0 (00000000)、-0 (11111111) 兩個 |
| 補碼 | 同原碼 | 反碼末位加 1 | -128 ~ +127 | 唯一 0 (00000000) |
補碼 = 原碼 = 反碼。最高位(符號位)為 0。
範圍:00000000 (0) ~ 01111111 (+127)。
以 -1 為例:
1000000111111110(符號位不變,數值位取反)11111111(反碼 + 1)以 -128 為例(特殊):
10000000(-0 的原碼)11111111(-0 的反碼)10000000(反碼 + 1 產生進位丟棄)結論:補碼將原碼/反碼中浪費的 -0 (10000000) 編碼重新分配給 -128,因此範圍擴展為 -128 ~ 127,共 256 個值(2^8)。
1 - 1 = 1 + (-1)00000001 + 11111111 = 100000000 → 丟棄溢出進位 → 00000000 (0) ✓範圍: -2^(n-1) ~ 2^(n-1) - 1
總數: 2^n
| 位數 | 範圍 |
|---|---|
| 8 (byte) | -128 ~ 127 |
| 16 (short) | -32,768 ~ 32,767 |
| 32 (int) | -2,147,483,648 ~ 2,147,483,647 |
| 64 (long) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
補碼是計算機科學中極具優雅的設計:用數學巧思解決硬體工程難題。理解其本質,不僅能搞清範圍由來,更能在處理位運算、溢出、序列化、網路協定解析時遊刃有餘。