計算機組成原理學習(二)原碼,反碼,補碼

2022-07-23 07:36:12 字數 3498 閱讀 9197

資料在計算機中以二進位制串儲存,這種01序列叫「機器數」。

每個機器數都有對應的值,比如0001換算就是現實裡十進位制的1,這個值叫它的「真值」。

1.原碼

為了表示負數的前面的符號,一種辦法是採用「最高一位表示符號而非數值」的編碼方式——原碼。

如八位的運算器,機器數0000 0001的真值為1,1000 0001的真值為-1。第一位為符號位,剩下的位表示真值。

解決了符號表示問題,但是引出了新的問題,那就是1000 0001不能按照常識意義上來換算了,按正常二進位制轉十進位制的換算,1000 0001實際上代表129。

這樣在硬體電路設計時會帶來麻煩,要讓機器能夠先辨識符號位,再進行真值的計算。

2.反碼

任何減法都可以轉化為加上乙個負數,如 1+1 = 1+(-1)。做加法比減法簡單,要是能用一種新的編碼方法把-1表示出來,然後和+1做加法,最後結果按照這種編碼方式還是正確的,那就太好了。於是為了讓符號位也能參與計算,反碼誕生了。

反碼的表示方法基於原碼,最高位仍然是符號位。正數的反碼是其本身,負數的反碼符號位不變,剩下的位全部取反

+1 原碼0000 0001,反碼 0000 0001

-1 原碼1000 0001,反碼1111 1110

人們發現,採用這種編碼方式,算出來的值是正確的。

用反碼計算:

1-1 = 1+(-1) = 0000 0001 + 1111 1110 = 1111 1111

而1111 1111的反碼是1000 0000,即 -0。

採用反碼的編碼方式看似解決了符號位參與運算的問題,但仍存在乙個明顯的問題,那就是0的表示不唯一

0000 0000代表 +0,1000 0000代表 -0,這是自原碼就有的問題,是沒有意義的。

你會發現——

用原碼表示,8位表示的機器數的範圍是 [1111 1111, 0111 1111]即[-127,127]。

[-127,127]按現實意義理解的話其實只有255個數,而8個位能理論上表示2^8 = 256個數,少掉的那一位就是用來表示0的正負號了。

3.補碼

人們希望有一種更好的編碼方式,既能解決符號參與運算的問題,又能讓0的表示唯一,由此誕生了補碼。

補碼是一種基於取模同餘的模運算系統的編碼方法,這樣說有點複雜,實際上用鐘錶來理解很容易。

時鐘的最上方從0開始,順時針依次為1,2,3……直到12。12同時也是0,時鐘表示了0到11總共12個數。

在這個系統中,計算這一行為就可以抽象為撥動指標。

比如我想做加法計算,如1+1,自然等於2,那也可以理解為:指標在1,我順時針撥一格,停在了2。減法運算1-1,就是時針在1,逆時針撥一格,結果為0。

加法就是順時針,減法就是逆時針,最後指標停在的位置就是結果。

那麼,從6撥到4,有兩種撥法,要麼順時針撥10格,要麼逆時針撥2格(當然順時針撥22格也是可以的,也就是多轉一圈)。即6+10 和 6-2 的結果是等價的。或者說在乙個計算式中, +10 和 -2 是等價的。

6 + 10  = 16,6 - 2 = 4,何以等價呢?只要讓:16對12取模(16除以12得出的餘數),結果就是4了。

該規律對於系統內的任何加減運算都是適用的,通過取模同餘的方式,把減法轉換成了加法,即-2 可以通過 +10 再對 12 取模來計算

-1 = +11 mod 12

-2 = +10 mod 12

-3 = +9 mod 12

不難發現,左邊負數的絕對值和右邊整數的和總是12,時鐘是乙個模12運算系統。

我們稱 -1 的補碼是 +11 、-2 的補碼是 +10、-3的補碼是+9,即乙個負數的補碼模運算系統的模減去它的絕對值

有了補碼的概念,1-1 的意思就可以轉述為 1 加上 1 的補碼,即正數減去負數的計算,轉化為該正數加上負數的補碼。

4.補碼的深入

乙個負數的補碼 =模運算系統的模減去它的絕對值

照這麼說,乙個4位的運算器可以表示 2^4 = 16 個數,把它視為乙個模16運算系統的話——

4位運算器負數的補碼 = 16 - 該負數的絕對值

那麼設有乙個負數 -x,上式就轉化為:

-x[補] = 2^4 - x

舉個例子,-1的補碼就是16-1 = 15,15表示為機器數就是1111。-2的補碼是14,表示為機器數就是1110。-8的補碼是8,表示為機器數就是1000。

按照這種編碼方式,把4位模運算系統表示的16個機器數,也畫成乙個時鐘的樣子,如下。

16個數劃分為了兩半,一半表示正數(0算在內),一半表示負數。

頂頭0000代表0,底下1000代表-8。0001到0111表示了0到7。1000到1111表示了-8到-1。

可以看到,0的表示是唯一的。

另外,假如有一減法,4 - 4。

4 - 4 = 4 + 4[補] = 4 + (2^4 - 4) = 4 + 12 = 0100 + 1100 (機器數)  = 0000

0100 與 1100 相加的結果是 1 0000,因為是4位運算器,最高一位會被捨去,保留下來的就是0000即0。

可見,補碼的編碼方式不僅解決了0表示不唯一的問題(多出來的一位還能多表示乙個負數),還方便了硬體的設計(把減法轉化為加法),解決了符號參與計算的問題。故現代計算機普遍採用補碼的編碼方式。

一樣不難發現,劃分成了正數一半(0算在內)、負數一半,最高一位其實仍然表示了符號

1000之前都是正數,除去最高位的後三位表示了機器數的真值,從1000開始變成負數,這是和原碼反碼一樣的特性。

綜上,因此有兩個結論。

1.假設有n位運算器,負數 -x 的補碼

-x[補] = 2^n - x

減法的計算,等於加上負數的補碼。

2.機器數的最高一位指示了正負號,0為正,1為負,同時也就劃分了正數一半(包括0),負數一半。

假設有n位運算器,它用補碼表示的資料範圍

[-2^(n-1), +2^(n-1)-1]

計算機組成原理學習二 原碼 反碼 補碼

一.機器數和真值 機器數乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1。eg.十進位制7機器數就是0000 0111,十進位制 7機器數就是1000 0111。真值 將帶符號位的機器數對應的真正數值稱為機器數的真值。就是...

計算機組成原理 原碼 反碼 補碼 移碼

原碼 正數的原碼 反碼 補碼 都相同,負數的原碼 符合位為1 其他位和正數原碼相同 負數的反碼 符號位不變 數值為 按位取反 負數的補碼 負數反碼 1 對乙個數做 取補運算 對該數各位 含符號位 取反 然後在末位 1 補碼性質 對 y 補 作取補運算可得 y 補。對 y 補 作取補運算可得 y 補。...

計算機組成原理 原碼 反碼和補碼

機器字長 暫存器的位數 計算機的數均存放於暫存器中 若機器字長為16位 有符號數的範圍為 2 15 2 15 1 注意 2 15在原碼中是無法表示的,但在計算機儲存的補碼形式可以表示 無符號數的範圍為0 2 16 1 用0表示正號,用1表示負號 1100 真值 11100 機器數 原碼 x 1110...