計算機底層運算邏輯


本文重點闡明了計算機中減法運算的實現以及反碼、補碼的意義。
對於加法來說,計算機很容易實現,

  舉例:8 + 6 = 14;
  在計算機中,也就是
  0000 1000
  0000 0110
  ------------------------
  0000 1110

  0000 1110表示的則就是14. 沒毛病

那么減法呢?

  舉例: 8 - 6 = 2;
  在計算機怎么實現?
  首先int型在當前的計算機中大多數是占了32位,這里我們為了簡便,就當作8位來處理(注意最高位是符號位,也就是8位的數據表示范圍是:-128~127)

  在計算機的邏輯運算單元中,只有加法運算器,用來對兩個數進行相加,並沒有減法器的電路。因為對於減法運算,計算機也是用加法器來實現的,比如8 - 6,也可以表示成 8 +(-6),這樣就變成了加法運算,問題變成了怎么讓計算機表示出負數,有的朋友可能想:6是0000 0110,變成負數后不就是1000 0110了么,這的確沒錯。但是這樣的表示並不能被加法器所支持,加法器是不知道負數的,盡管我們把最高一位定義成了符號位。
  8的二進制是 0000 1000
  -6的二進制是1000 0110
  0000 1000
  1000 0110
  --------------
  1000 1110

  而1000 1110表示的是-14,這顯然不是我們要的結果。

  那么換一個思路,我們知道,現在我們舉例的是8位數,最高的表示是127.

  舉個時鍾的例子。數字時鍾上最大值是24點,這里的24點就是模。當到24點的時候,被取模后成為了0點。而減去1點和加上23點的效果都是一樣的,無非就是補數和取模。24+23了后取模也是23,都是表示23點。

  所以8 - 6就跟 8 + (128 - 6)是一樣的。(這里的128是模)

  於是乎,減法是可以被當作加法來運算的。

  所以計算機便有了反碼的概念。正數的反碼是自身,負數的反碼則是除了符號位之后其他都取反(就相當於自己去加上摸之后取模后的結果)。

  但是反碼后有一個問題,就是關於“0”的表示,那就是1000 0000和0000 0000都表示0,分別表示 +0 和 -0,而數學意義上並沒有正負之分。所以必須消除其中一個

  於是有了補碼的概念。正數的補碼還是原碼,負數的補碼是原碼在得到反碼后再+1,

  讓0只有在0000 0000的時候才表示0。
  而1000 0000表示 -128,(注意,-128是通過反碼后的-0再加1得到的,-128是沒有反碼的。PS:正因如此,所以上文才說8位的數據表示范圍是:-128~127,而不是從-127開始)

  於是乎 上面的 8 - 6 = 8+(-6)的問題

  8的原碼、反碼、補碼都是原碼:0000 1000
  而-6的原碼是 1000 0110
  反碼則是除符號位外,其余位取反:1111 1001
  補碼則是反碼+1,即: 1111 1010
  於是兩個補碼相加:
  0000 1000
  1111 1010
  ---------------------
  0000 0010

  0000 0010則是2, 正是 8 - 6的結果。

  到這里已經說明了減法的實現,其實也就是利用反碼和補碼的機制,以轉換成加法運算。

  而這還沒完呢,我們再來看一個例子:
  6 - 8 = -2

  這還不簡單? 6 - 8就等於6 + (-8)嘛,於是:
  6的原碼、反碼、補碼都是原碼:0000 0110
  而-8的原碼是 1000 1000
  反碼則是除符號位外,其余位取反:1111 0111
  補碼則是反碼+1,即: 1111 1000
  於是兩個補碼相加:
  0000 0110
  1111 1000
  ---------------------
  1111 1110

  天哪,1111 1110的十進制數是-126啊,6 - 8怎么可能等於-126呢。

  顯然,我們這個減法當作加法來運算貌似不是特別靠譜。只要當被減數的絕對值小於減數的絕對值的時候,計算出來的結果總是不對。

  當然了 不對是正常的,因為我們是用補碼來計算,計算的結果也不是原碼。這里因為符號位也參與了計算,所以最高一位並不是表示符號位了,1111 1110則是254了。想想?254 - 256 = -2,剛好是6 - 8的結果。這絕對不是偶然。

  我們把1111 1110求一次補碼,先取得其反碼是: 1000 0001
  則其補碼則是:1000 0010

  天吶,1000 0010則就是-2,太神奇了。

  所以計算機的減法運算中,運算的結果是需要再求一次補碼的

  在前一個例子8 - 6的2,是因為2是正數,反碼、補碼與原碼都一樣

  最后總結一下:
    概念:
    原碼:帶符號位的,我們表示的數值
    反碼:正數的反碼是原碼,負數的反碼是除了符號位之外其余位取反
    補碼:正數的補碼是原碼,負數的補碼是反碼+1

  減法運算:
  通過反碼的方式來將減法轉換成加法運算,通過補碼的方式消除了+0和-0的歧義。而在減法的運算結果中,還需要對結果進行補碼。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM