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

C語言補碼深度理解:從定義到真值轉換完整推導

     編輯:關於C

背景:為什麼選補碼?

  • 符號位參與運算,減法轉加法(A - B = A + (-B))。
  • 唯一表示 0(原碼/反碼有 +0/-0)。
  • 硬體實現簡單:同一加法器處理有號/無號。

參考:為什麼選補碼

8 位補碼範圍推導

正數(符號位 0)

00000000 (0) ~ 01111111 (127)。
正數補碼 = 真值二進制。

負數(符號位 1)

模 M = 2^8 = 256。負數 -x 的補碼 = M - x。
-1 → 255 → 11111111
-127 → 129 → 10000001
-128 → 128 → 10000000

範圍:-128 ~ -1(比原碼/反碼多表示 -128)。

真值 ↔ 補碼 轉換規則

真值 → 補碼(同余法)

正數:直接寫二進制。
負數 -x:計算 256 - x,寫二進制。
例:-126 → 256-126=130 → 10000010。

補碼 → 真值(同余逆運算)

補碼值 C(作為無號數讀取):
若符號位 0 → 真值 = C。
若符號位 1 → 真值 = C - 256。
例:10000010 (130) → 130 - 256 = -126。
10000000 (128) → 128 - 256 = -128。

傳統「取反加一」法的缺陷

對 -128:
真值 -128 無原碼表示(8 位原碼範圍 -127~127)。
強行取反加一會丟失進位,得到 10000000,雖結果正確但邏輯不通。
同余定義才是本質,取反加一只是 M=2^n 時的計算技巧。

驗證表

真值補碼(二進制)無號解讀補碼→真值計算
00000000000
12701111111127127
-111111111255255-256=-1
-12710000001129129-256=-127
-12810000000128128-256=-128

總結

  1. 補碼本質是模 2^n 同余系統,負數 -x 對應 2^n - x。
  2. 8 位有號範圍 -128 ~ 127,非對稱源於 0 佔用一個編碼。
  3. 轉換口訣:負數補碼 = 256 - 絕對值;補碼轉真值 = 無號值 - (符號位?256:0)。
  4. 理解同余定義,避免死記「取反加一」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved