二進位制中的負數表示有一個重要的概念是補碼,它是由對應正數二進位制取反後再加 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 的表示過程是:
- 將 5 的二進位制按位取反:1111 1010
- 加1:1111 1011
因此,-5 的補碼錶示是 1111 1011。
5. 運算一致性
驗證: 透過補碼錶示,負數可以直接參與加法運算,而無需額外的減法電路。
例如,計算 5 + (-5):
- 5 的二進位制表示是 00000101
- -5 的補碼錶示是 11111011
二者相加:
00000101
+ 11111011
----------
100000000 (由於是8位系統,只取低8位,結果為 00000000)
結果為 00000000,表示0,運算正確。
6. 統一零的表示
優勢: 使用補碼錶示法,零隻有一種表示形式,即 00000000,這簡化了零的處理邏輯,避免了符號-絕對值表示法中正零和負零的問題。
7. 溢位檢測簡化
溢位檢測: 在補碼錶示法中,溢位可以透過簡單的邏輯操作檢測到。例如:
- 兩個正數相加結果為負數
- 兩個負數相加結果為正數
這可以透過檢查結果的符號位來實現。
設計邏輯總結
補碼的設計邏輯旨在簡化和統一計算機中有符號數的表示和運算。其主要優勢包括:
- 符號位的直觀使用
- 負數的補碼錶示使加法和減法運算一致
- 零的唯一表示形式
- 簡化的溢位檢測
透過這些設計,補碼有效地解決了在計算機中處理有符號數的各種挑戰,成為現代計算機系統中廣泛採用的表示方法。