[軟體工程] 二進位表達負數:1’s Complement 與 2’s Complement

在電腦的世界中,如何用二進位表達負數?一補數與二補數入門介紹。

Tiffany Chen
82年生的蒂芬妮
4 min readAug 15, 2023

--

如何用二進位表達負數?」

最近被問到如何用二進位表達負數,腦中浮現了大學的數位電路設計課程,無奈的是短時間內依稀記得很多 1,什麼東西 0、1 交換,很遺憾地沒有完整回答出這個問題。對話結束後,這個問題還是時不時的浮在腦海裡,乾脆來複習一下用二進位表達負數的方法,那我們就開始吧。

💡 Contents:
1. 如何用二進位表達負數?
2. Signed Magnitude
3. 1's Complement
4. 2's Complement
5. 總結

1. 如何用二進位表達負數?

用二進位表達負數的方法有三種:

  1. Signed Magnitude
    用第一位表達正負數,0 為正,1 為負
  2. 1’s Complement
    一補數
  3. 2’s Complement
    二補數,為電腦的世界中,最普遍用來表達負數的方法

這三個的差別在哪呢?接下來,用 -2 這個負數來試試看吧!

用 Signed Magnitude、1’s Complement、2’s Complement 表達 4 bit 二進位數字統整。

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 表單留言唷 : )

--

--

Tiffany Chen
82年生的蒂芬妮

Graphics Software Engineer @ MD。白天是名軟體工程師,晚上偶爾寫寫 blog,2021年秋天跟著 DRT 搬至美國亞利桑那州居住,記錄AZ新鮮人的日常生活&軟體工程筆記。現居MD。