首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

補碼原理深度解析:為什麼計算機用補碼表示有號整數

     編輯:關於C語言

三種編碼方式對比(以 4 位元為例)

1. 原碼

  • 最高位為符號位(0 正、1 負),其餘為數值
  • 範圍:-7 ~ +7,但 0 有兩種表示(0000=+0、1000=-0)
  • 減法需單獨處理符號,硬體複雜

2. 反碼

  • 負數 = 正數按位取反
  • 0 仍有兩種表示(0000=+0、1111=-0)
  • 減法可用加法器:A - B = A + (~B),但需處理雙重 0

3. 補碼(現代標準)

  • 負數 = 正數取反 + 1
  • 0 唯一表示(0000)
  • 範圍:-8 ~ +7(比原碼/反碼多表示 -8)
  • 減法直接用加法器:A - B = A + (~B + 1),無特殊情況

模數系統視角(鐘面模型)

4 位元系統模數 M = 16。位元模式 0000~1111 對應鐘面 0~15 刻度。

  • 補碼中 1111 代表 -1(順時針 15 格 = 逆時針 1 格)
  • 1000 代表 -8
  • 加減法統一為模 M 運算,硬體極簡

「取反加一」定理的本質

+5 = 0101
~5 = 1010
~5+1 = 1011 = -5 (補碼)

// 驗證:0 - 5
0000 - 0101 = 0000 + 1011 = 1011 = -5 ✓

此定理非任意規定,而是模數系統中「加法逆元」的自然結果。

擴展到實際位寬

  • 8 位元(char):模數 256,範圍 -128 ~ 127
  • 32 位元(int):模數 2³²,範圍 -2³¹ ~ 2³¹-1
  • 64 位元(long long):模數 2⁶⁴

軟體視角的型別解讀

記憶體中位元模式 11111111 可解讀為:

  • unsigned char:255
  • signed char:-1

由指令集(有號/無號指令)與旗標(進位/溢位旗標)決定語意。

結論

補碼將減法轉為加法、消除雙重零、最大化表示範圍、硬體實作最簡單,成為現代計算機通用的有號整數表示法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved