| 碼制 | 符號位 | 數值位 | 正數 | 負數 |
|---|---|---|---|---|
| 原碼 | 0正/1負 | 絕對值二進制 | 同原碼 | 符號位1,數值位不變 |
| 反碼 | 同原碼 | 正數同原碼 | 同原碼 | 符號位不變,數值位按位取反 |
| 補碼 | 同原碼 | 正數同原碼 | 同原碼 | 反碼末位+1(或原碼取反+1) |
關鍵點:計算機統一用補碼存儲與運算。8位補碼範圍 -128 ~ +127,其中 -128 (0x80) 無對應原/反碼。
定義:對原碼(含符號位)按位取反,末位+1。結果 = 該數相反數的補碼。
快速手算法:從右向左,遇到第一個 1(含該位)保持不變,其餘位取反。
例:+5 = 0000 0101
求補 → -5 的補碼
從右起第一個1是最低位:
保留最低位1 → 1
其餘取反 → 1111 101
結果:1111 1011 (0xFB) = -5 補碼
計算機只有加法器,減法轉化為加相反數:
A - B = A + (-B) = A + (B 的求補結果)
2 的補碼: 0000 0010
-1 的補碼: 1111 1111 (原碼 1000 0001 → 取反 1111 1110 → +1)
-----------------------------------
相加: 1 0000 0001
溢出位丟棄: 0000 0001 = +1 ✓
1 的原碼: 0000 0001
按位取反: 1111 1110
末位 +1: 1111 1111 ← 這就是 -1 的補碼(即 1 的相反數補碼)
2 的補碼: 0000 0010
相加同上 → 0000 0001 = +1 ✓
| 位寬 | 無符號範圍 | 有符號補碼範圍 | 最小負數特殊性 |
|---|---|---|---|
| 8 | 0 ~ 255 | -128 ~ 127 | -128 無原/反碼 |
| 16 | 0 ~ 65535 | -32768 ~ 32767 | -32768 無原/反碼 |
| 32 | 0 ~ 4294967295 | -2147483648 ~ 2147483647 | 同理 |
x - y 轉為 x + (~y + 1),理解此機制有助閱讀彙編輸出。int8_t/int16_t 運算隱含補碼語義,混合類型提升規則必須清晰。