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

匯編語言補碼運算與求補運算全解析:從原碼反碼到計算機內部減法實現

     編輯:關於C語言

三碼體系速覽

碼制符號位數值位正數負數
原碼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 - 1 = 1 (8位機器字長)

方法一:補碼加法(硬件實際做法)


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 ✓

溢出與丟棄規則

  • 補碼加法產生最高位進位(Carry Out)直接丟棄,不影響結果正確性。
  • 但若有符號數運算結果超出表示範圍(如 127+1=-128),發生溢出,結果錯誤,需靠 OF 標誌檢測。

擴展:不同位寬的範圍

位寬無符號範圍有符號補碼範圍最小負數特殊性
80 ~ 255-128 ~ 127-128 無原/反碼
160 ~ 65535-32768 ~ 32767-32768 無原/反碼
320 ~ 4294967295-2147483648 ~ 2147483647同理

工程應用啟示

  1. 定點數 DSP 算法需精確掌握補碼溢出特性,設計飽和運算或縮放策略。
  2. 編譯器優化常將 x - y 轉為 x + (~y + 1),理解此機制有助閱讀彙編輸出。
  3. 嵌入式 C 代碼中 int8_t/int16_t 運算隱含補碼語義,混合類型提升規則必須清晰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved