天天看點

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

無符号數

寄存器的位數反映和決定無符号數的表示範圍

比如八位的寄存器就隻能儲存十進制的0-255

有符号數

機器數與真值

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

在計算機當中沒有硬體表示小數點的位置,而小數點的位置是我們自己約定的,

小數的時候,小數點的位置預設是在符号位的後面,符号位在寄存器的最高位,

整數的時候,小數點的位置預設是寄存器最低位的後面

原碼表示法

整數

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

這裡x表示需要表示的值,而n表示的是存儲整數n需要的位數,例如:

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

小數

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

原碼的特點: 簡單、直覺 但是用原碼作加法時,會出現如下問題:

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

能否隻作加法?

找到一個與負數等價的正數來代替這個負數,就可使減變成加 ,下面就是解決方案:補碼

補碼

補的概念

比如時鐘,現在是六點,你要轉到3點,有兩種方法:

減法:6-3=3

加法:6+9=15=3點

是以這裡+9和-3的效果是一樣的,減法可以變換成加法

稱 + 9 是 3 以 12 為模的 補數

結論:

一個負數加上“模”即得該負數的補數

一個正數和一個負數互為補數時,它們絕對值之和即為模數

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

正數的補數即為其本身

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

這時我們就發現,寄存器的位數為4位,模是16的兩個數-13和3,

它們的補數都是3,正數的補碼是本身

但是我們如何差別這個補碼是正數的還是負數的補碼呢?

我們發現,如果是加上2^(n+1),n表示數值的位數,

2^(4+1)+(-1011)=100000-1011=10101

2^(4+1)+0101=100000+0101=100101=00101(第六位去掉,現在我們是寄存器是五位)

是以我們想使用一位來表示這個補碼是正數還是負數

補碼定義

整數

x是實際的值,n表示的是整數的位數,n+1是寄存器的位數,因為有一位來存儲符号了

這樣當是正數的時候,補碼的符号位是0,負數的時候補碼符号位是1

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

小數

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

求補碼的快捷方式

x = 1010 時

前面的公式求補碼的方式:

[x]補 =2^(4+1) - 1010 =100000-1010=10110

我們也可以換一種思維:

[x]補 =(11111+1)-1010=(11111-1010)+1=10101+1=10110

因為11111和任何比它小一位的數字相減,都是前面第一位是1後面取反

是以我們得出一個求補碼的快捷方式:

當真值為負時,補碼可用原碼除符号位外每位取反,末位加1求得

它反過來也成立:

當真值為負時,原碼可用補碼除符号位外每位取反,末位加1求得

練習:

真值:0.0000

補碼:0.0000

原碼:0.0000

真值:-0.0000

補碼:0.0000

原碼:1.0000

真值:-1.0000(注意這裡是小數)

補碼:根據定義:2+x=10.0000-1.0000=1.0000

原碼:無法表示

反碼

整數

反碼就是負數的時候原碼的每個位置反過來,是以就是比補碼少了一個+1,

定義中就是模=(之前的模-1)

和之前一樣,x是真值,n是整數的位數,n+1是寄存器的位數

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

小數

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

例子:求 0 的反碼

假設x=+0.0000

反碼:0.0000

x=-0.0000

反碼:1.1111

x=+0

反碼:0,0000

x=-0

反碼:11111

三種機器數總結

  1. 最高位為符号位,書寫上用“,”(整數) 或“.”(小數)将數值部分和符号位隔開
  2. 對于正數,原碼 = 補碼 = 反碼
  3. 對于負數,符号位為1,其數值部分

    原碼除符号位外每位取反末位加1變成補碼

    原碼除符号位外每位取反變成反碼

    設機器數字長為 8 位(其中1位為符号位) 對于整數,當其分别代表無符号數、原碼、補碼和 反碼時,對應的真值範圍

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

已知[y]補碼,求[-y]補碼

假設y補碼=y0. y1 y2 … yn

如果y補碼表示一個小數而且是正值:y補碼:0.y1 y2 …yn

那麼y就是:0.y1 y2 …yn

-y就是:-0.y1 y2 …yn

-y的補碼就是:1.^ y1^ y2…^ yn + 2^-n ( ^y1表示y1的取反)

是以y的補碼就是-y的補碼連同符号位在内,每一位取反,末位加一得到的

下面再來假設y的補碼表示的是負數

y的補碼=1.y1 y2 …yn

y的原碼1.^ y1^ y2…^ yn + 2^-n ( ^y1表示y1的取反)

y的值:-(0.^ y1^ y2…^ yn + 2^-n)

-y的值(正數,補碼一樣):0.^ y1^ y2…^ yn + 2^-n

是以上面的結論是正确的

移碼

補碼表示很難直接判斷其真值大小 ,比如

十進制31 和-31

二進制+11111和-11111

補碼011111和100001,這樣比較不了大小

而我們不是2^(n+1)+x,改變成2 ^n +x

那麼就變成111111 和000001

這樣比較就是31大于-31了

其實這樣就是移碼

定義

注意,移碼隻有整數的定義,沒有小數的定義

[x]移 = 2^n + x(2n>x ≥ 2n)

x 為真值,n 為 整數的位數

相當于在真值上集體移動了2^n

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

移碼和補碼的比較

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

移碼的特點

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

繼續閱讀