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

C語言補碼詳解:負數存儲與位運算基礎

     編輯:C 語言問答

補碼:計算機有符號整數表示法標準

三碼對比(以 8 位為例)

數值原碼反碼補碼
+50000 01010000 01010000 0101
-51000 01011111 10101111 1011

補碼形成規則

  • 正數:補碼 = 原碼 = 反碼
  • 負數:
      1. 寫出絕對值原碼
      2. 符號位保持 1,數值位按位取反 → 反碼
      3. 反碼 + 1 → 補碼

快速計算負數補碼

從右向左掃描,遇到第一個 1 及其右側保持不變,左側全部取反

-5: 絕對值 0000 0101
     從右掃描:第一個1在最低位
     右側(無)保持,左側取反 → 1111 1011

補碼優勢

  1. 符號位參與運算,減法轉為加法:A - B = A + (-B)
  2. 唯一表示 0(0000 0000),原碼/反碼有 +0 和 -0 兩種
  3. 擴展位寬簡單:符號位擴展(正數補 0,負數補 1)
  4. 溢出檢測簡單:符號位進位 ≠ 最高數值位進位

C語言中的體現


signed char c = -5;  // 內存中存儲補碼 1111 1011 (0xFB)
printf("%d\n", c);   // 輸出 -5,編譯器自動按補碼解釋
printf("%x\n", c);   // 輸出 fb,按無符號十六進制顯示位模式

位運算與補碼

  • ~x(按位取反)= -x - 1(補碼性質)
  • x & (-x) 取最低位 1(利用補碼特性)
  • 右移 >>:算術右移保持符號位(補 1),邏輯右移補 0(C 標準對有符號數實現定義)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved