─────無號數/有號數───
┌──000:0 +0───┐
│┌─001:1 +1──┐│
│┌─010:2 +2─┐││
││┌011:3→+3┐│││補數定義原理
││└100:4 -4┘│││
│└─101:5 -3─┘││
│└─110:6 -2──┘│
└──111:7 -1───┘
──────加減法原理────

負數的定義

以二進位來表示數字,以三碼為例,則有 0~7 共 8 個數字可定義。但若欲定義負數,則取首碼來表示正負(0為正、1為負),後兩碼對應數字,共可定義 -4~+3 同樣共 8 個數字;然而其中負數最大的是 -1,故以 111 訂之,負數中最小的是 -4,以 100 訂之,其餘依大小類推,確保二進位與十進位的大小加減方向相同。而非直接以後兩碼的二進位數字表示!

2的補數定義

如此定義之後,由圖中對稱性可知,譬如將 3 的二進位表示 011 完全翻轉成 100 之後,對應的是 -4(而非 -3!這是由於為了把 0 定義進來,導致正負數範圍不對稱),因此只要再加 1 上去,就會變成 -3 的二進位表示 101 了!即:

011:(+3) ──翻轉─→ 100:(-4) ──再加1─→ 101:(-3)

這就是從 +3 取其2的補數得到 -3 的方式。

加減法原理

這樣的定義也使得負數自動符合減法運算!只要再加上一個條件:溢位就忽略掉。這樣運算結果就只會在 -4~+3 之間循環。

譬如運算 2 + (-3),在二進位的運算即對應 010+101,這其實在原本二進位的無號數定義中是 2 +5 的意義!但沒關係,因為溢位就忽略掉造成的循環,我們發現 +5 的運算和 -3 的運算效果是一模一樣的!意即在這些運算之中:
+4 與 -4 效果相同
+5 與 -3 效果相同
+6 與 -2 效果相同
+7 與 -1 效果相同

因此原本二進位無號數下半部的加法操作,可以直接照搬過來視為二進位有號數的減法操作。

參考資料:
啟發自這篇網路上最看得懂的解說文章:二進位制的負數表示法(it FunYard — RD菜鳥日誌)

Advertisements