補碼原理——負數爲何要用補碼錶示

文首.net

咱們都知道負數在計算機中是以補碼(忘了補碼定義的戳這裏)表示的,那爲何呢?本文嘗試瞭解補碼的原理,而要想理解它,首先得理解算術中「模」的概念。因此首先看一下什麼是模,而後經過一個小例子來理解補碼。
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).blog

1.1.1 理解it

模是指一個計量系統的計數範圍。如時鐘等。計算機也是一個計算器,它也是有一個計量範圍,即都存在一個「模」。
如時鐘的計量範圍是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就要轉化爲加法:math

 # 按以上理論,減一個數等於加上它的補數,因此
 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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

由於咱們的計算機是 4 位的,第一位「溢出」了,因此咱們只保存了 4 位,即 0010,而當計算機去讀取時這正是咱們所指望的 2!!歎爲觀止吧,天才般的設計!感恩伏羲、萊布尼茲和馮諾依曼! 文末

相關文章
相關標籤/搜索