補碼原理——負數為什麼要用補碼錶示
文首
我們都知道負數在計算機中是以補碼(忘了補碼定義的戳這裡)表示的,那為什麼呢?本文嘗試瞭解補碼的原理,而要想理解它,首先得理解算術中“模”的概念。所以首先看一下什麼是模,然後通過一個小例子來理解補碼。
1 模(Modulo)
1.1 什麼是模數
In mathematics, modular arithmetic is a system of arithmetic for integers, where numbers “wrap around” upon reaching a certain value—the modulus (plural moduli).
1.1.1 理解
模是指一個計量系統的計數範圍。如時鐘等。計算機也是一個計算器,它也是有一個計量範圍,即都存在一個“模”。 如時鐘的計量範圍是0~11,模 = 12。 32位計算機的計量範圍是2^32,模 = 2^32。 “模”是計量器產生“溢位”的量,它的值在計量器上表示不出來,計量器上只能表示出模的餘數,如12的餘數有0,1,2,3,4,5,6,7,8,9,10,11。
1.2 補數
假設當前時針指向11點,而準確時間是8點,調整時間可有以下兩種撥法:
- 一種是倒撥3小時,即:
11-3=8
- 另一種是順撥9小時:
11+9=12+8=8
在以模為12的系統中,加9和減3效果是一樣的,因此凡是減3運算,都可以用加9來代替。對“模”12而言,9和3互為補數
1.3 再談“模”
從上面的化減法為加法,以及所謂的溢位等等可以看到,“模”可以說就是一個太極,陰陽轉化,周而復始,無始無終,迴圈往復。
2 補碼原理
計算機上的補碼就是算術裡的補數。
設我們有一個 4
位的計算機,則其計量範圍即模是
2^4 = 16,所以其能夠表示的範圍是0~15
,現在以計算 5 - 3
為例,我們知道在計算機中,加法器實現最簡單,所以很多運算最終都要轉為加法運算,因此5-3
就要轉化為加法:
# 按以上理論,減一個數等於加上它的補數,所以 5 - 3 # 等價於 5 + (16 - 3) // 算術運算單元將減法轉化為加法 # 用二進位制表示則為: 0101 + (10000 - 0011) # 等價於 0101 + ((1 + 1111) - 0011) # 等價於 0101 + (1 + (1111 - 0011)) # 等價於 0101 + (1 + 1100) // 括號內是3(0011)的反碼+1,正是補碼的定義 # 等價於 0101 + 1101 # 所以從這裡可以得到 -3 = 1101 # 即 `-3` 在計算機中的二進位制表示為 `1101`,正是“ -3 的正值 3(`0011`)的補碼(`1101`)”。 # 最後一步 0101 + 1101 等於 10010
因為我們的計算機是 4
位的,第一位“溢位”了,所以我們只儲存了 4
位,即 0010
,而當計算機去讀取時這正是我們所期望的 2
!!歎為觀止吧,天才般的設計!感恩伏羲、萊布尼茲和馮諾依曼!
文末
一陰一陽之謂道。萬事萬物,陰陽轉化,周而復始,無始無終,迴圈往復。
--------------------- 本文來自 leonliu06 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/leonliu06/article/details/78685197?utm_source=copy