[軟體工程] 二進位表達負數:1’s Complement 與 2’s Complement
在電腦的世界中,如何用二進位表達負數?一補數與二補數入門介紹。
「如何用二進位表達負數?」
最近被問到如何用二進位表達負數,腦中浮現了大學的數位電路設計課程,無奈的是短時間內依稀記得很多 1,什麼東西 0、1 交換,很遺憾地沒有完整回答出這個問題。對話結束後,這個問題還是時不時的浮在腦海裡,乾脆來複習一下用二進位表達負數的方法,那我們就開始吧。
💡 Contents:
1. 如何用二進位表達負數?
2. Signed Magnitude
3. 1's Complement
4. 2's Complement
5. 總結
1. 如何用二進位表達負數?
用二進位表達負數的方法有三種:
- Signed Magnitude
用第一位表達正負數,0 為正,1 為負 - 1’s Complement
一補數 - 2’s Complement
二補數,為電腦的世界中,最普遍用來表達負數的方法
這三個的差別在哪呢?接下來,用 -2 這個負數來試試看吧!
2. Signed Magnitude
2 和 -2 範例
- 十進位:2
二進位:0010 - 十進位:-2
二進位:1010
算法
Signed Magnitude 為最直觀的表達方法 —用第一項表達正負號。第一項稱為 Signed Bit,0 代表正,1 代表負,後續位數全數相同。
範圍
4 bit 數字可表達的範圍為 -7 ~ +7。
優點
最直觀,對人類來說很好懂。
缺點
雖然對人類來說最好懂,但對機器而言,除了字面上的理解之外,還要考慮加減等運算時的複雜度,因此衍生出了接下來兩種對電腦比較友善的方法— 1’s Complement 和 2’s Complement。
3. 1’s Complement
2 和 -2 範例
- 十進位:2
二進位:0010 - 十進位:-2
二進位:1101
算法
正數的 0、1 全部交換。
範圍
4 bit 數字可表達的範圍同 Signed Magnitude,為 -7 ~ +7。
優點-加法器友善
用一補數表達負數之後,減法的運算「A - B」,可使用「 A + (-B)」算得,即用數字 A 加上數字 B 的一補數而來,再依進位(carry)和溢位(overflow)的狀況後處理,得最終結果。
缺點-不唯一的「0」
值得注意的是,若用 1’s Complement 表達負數,「0」會用兩個表達方法— 「0000」和「1111」,這兩者都是 0。+0 和 -0 代表的是同樣的數字,但在一補數的二進位表示法卻不相同,因此造成一些混淆,也帶出了下一個方法 — 2’s Complement。
4. 2’s Complement
2 和 -2 範例
- 十進位:2
二進位:0010 - 十進位:-2
二進位:1110
算法
1’s Complement 再加 1。
範圍
4 bit 數字可表達的範圍為 -8 ~ +7,多一個可表達的數字了。
優點-唯一的「0」
「0」的表示方法只有「0000」一種,不再有兩種表達方法了,達到避免混淆的效果。
因為 0 的表達方法沒有重複的關係,用 2’s Complement 來表達負數的話,多了一種排列組合可以拿來用,也就是 -8(1000),所以 2’s Complement 對比前兩個方法還有一個好處 —能表達的數字多了一個。
5. 總結
還記得大學這些基礎課程時學什麼都覺得好辛苦,在業界打滾幾年後漸漸有了一些「感覺」,也開始會主動回頭去看看一些以前學過但已忘記(或是根本沒理解過 😂)的內容。
本篇初步介紹如何用二進位表達負數 — Signed Magnitude、1’s Complement、和 2’s Complement。其中,因為數學計算的關係,2’s Complement 為現今電腦的世界中最主流的方法。
本篇提到 1’s Complement 和 2’s Complement 有利於電腦的計算,關於怎麼加,怎麼依 carry 和 overflow 後處理,就留給下一篇討論了,有興趣的讀者,歡迎先用關鍵字「Binary addition」搜尋看看,那我們就下次見啦!
-2023.08.14。
想敲碗什麼樣的內容,或資訊有誤/欲補充的話,歡迎在下方留言讓我知道,不好意思公開的話,也歡迎在Google 表單留言唷 : )