二進位制中為什麼負數是正數取反再加一

marsggbo發表於2024-07-03

二進位制中的負數表示有一個重要的概念是補碼,它是由對應正數二進位制取反後再加 1 得到的。但是經常忘記為什麼要這麼表示,這裡結合 chatgpt 解釋做個簡單的總結。

補碼(Two's Complement)設計的邏輯來自於簡化和統一計算機中有符號數的表示和運算。其設計邏輯可以追溯到電腦科學中的一些基本需求和目標。以下是補碼設計邏輯的詳細解釋:

1. 有符號數的表示

目標: 在計算機中,需要一種方法來表示正數和負數,同時要確保運算的簡便性和一致性。

2. 符號位的使用

思路: 使用最高位(最左邊一位)作為符號位。0表示正數,1表示負數。這是因為使用最高位作為符號位可以直接決定數的正負,同時剩餘的位可以用於表示數值部分。

3. 簡化運算

需求: 希望計算機能夠使用相同的電路(主要是加法器)來處理加法和減法。

實現:

  • 對於加法,直接進行二進位制加法。
  • 對於減法,將減法轉換為加法,透過加上一個負數來實現。

4. 負數的表示

挑戰: 如何表示負數使得上述需求能夠被滿足?

這裡我們可以假設給定一個正數,例如 5 的8位二進位制是 0000 0101,那麼我們該如何設計-5 呢?

很顯然,最重要想實現的目的是 5+-5=0,也就是 0000 0101 + x = 0000 0000, 手動算一下減法,x= 1111 1011。觀察一下規律你會發現,x 其實就是 0000 0101取反再加 1。

整理一下,如下:

補碼的引入:

  • 按位取反加1: 補碼的核心思想是,將一個數的負數表示為該數的按位取反再加1。

例如,對於8位系統中的數字:

  • 正數 5 的二進位制表示是 0000 0101。
  • 負數 -5 的表示過程是:
    1. 將 5 的二進位制按位取反:1111 1010
    2. 加1:1111 1011
      因此,-5 的補碼錶示是 1111 1011。

5. 運算一致性

驗證: 透過補碼錶示,負數可以直接參與加法運算,而無需額外的減法電路。

例如,計算 5 + (-5):

  • 5 的二進位制表示是 00000101
  • -5 的補碼錶示是 11111011

二者相加:

  00000101
+ 11111011
  ----------
  100000000  (由於是8位系統,只取低8位,結果為 00000000)

結果為 00000000,表示0,運算正確。

6. 統一零的表示

優勢: 使用補碼錶示法,零隻有一種表示形式,即 00000000,這簡化了零的處理邏輯,避免了符號-絕對值表示法中正零和負零的問題。

7. 溢位檢測簡化

溢位檢測: 在補碼錶示法中,溢位可以透過簡單的邏輯操作檢測到。例如:

  • 兩個正數相加結果為負數
  • 兩個負數相加結果為正數

這可以透過檢查結果的符號位來實現。

設計邏輯總結

補碼的設計邏輯旨在簡化和統一計算機中有符號數的表示和運算。其主要優勢包括:

  • 符號位的直觀使用
  • 負數的補碼錶示使加法和減法運算一致
  • 零的唯一表示形式
  • 簡化的溢位檢測

透過這些設計,補碼有效地解決了在計算機中處理有符號數的各種挑戰,成為現代計算機系統中廣泛採用的表示方法。

相關文章