計算機中減法的實現原理

2021-09-02 22:10:18 字數 2679 閱讀 6810

這本來就是大一的時候就開始學習的,但是之後一直沒再接觸。一接觸但有概念而沒有乙個清晰的過程,所以再次縷清了後記錄一下部落格。本文重點闡明了計算機中減法運算的實現以及反碼、補碼的意義。

對於加法來說,計算機很容易實現,

舉例: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的歧義。而在減法的運算結果中,還需要對結果進行補碼。

計算機中的定址

電腦的位數通常是指cpu的處理位數,這個不是靠位址匯流排來決定的,這個位數指的是cpu 通用暫存器的資料寬度,即cpu一次運算可以處理的資料bit長度。前面所說的是記憶體空間足夠的情況,下面用過一道軟考題目解釋記憶體空間 定址範圍的情況 某計算機字長32位,儲存容量8mb。按字編址,其定址範圍為 0...

計算機中的單位

關於字的概念,今天才發現自己一直沒有弄清楚.原來,對於字長為16位的計算機,儲存器中兩個連續位元組被稱為字 word 乙個字有16個位元 四個連續的位元組被稱為雙字 doubleword 雙字有32個位元。如果計算機的字長為32位,則乙個字有4個位元組,即32個二進位制,雙字的長度相應的為64個二進...

計算機中的編碼

ascii 英文編碼,用乙個位元組 0 255 表示英文本元 gb2312 漢字編碼,用兩個位元組表示中文漢字,同時相容英文 多餘的部分用0補足 但是其他國家的文字都有自己的編碼方式,當不同國家的文字在一起時不能相容,此時出現了unicode編碼 但是unicode編碼在表示英文本元時會浪費一倍的儲...