計算機組成原理(原碼、反碼、補碼)

上一期我們講述了進制數及轉換,這一期我們來了解計算機

原碼、反碼和補碼,本期內容重點是補碼。

計算機組成原理(原碼、反碼、補碼)

來自網絡

引入這三種編碼的原因是什麼?

是為了解決計算機減法問題,因為CPU運算器中只有加法器,所有要把減法轉換加法來運算;

那麼你可能會問,怎麼不加個減法器呢?

其實這樣除了節約成本外,比如:1-1=1+(-1)=0機器可以只有加法而沒有減法,這樣計算機運算的設計也就更加簡單。

為什麼用補碼進行存儲?

計算機組成原理(原碼、反碼、補碼)

簡單介紹機器數,真值,原碼和反碼的背景。

1、機器數

一個數在計算機中的二進制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數0,負數為1。

比如,十進制中的數 +3 ,計算機字長為8位,轉換成二進制就是0000 0011。如果是 -3 ,就是 1111 1101 。那麼,這裡的 00000011 和 1111 1101 就是機器數。 機器數包含了符號和數值部分。

2、真值

因為第一位是符號位,所以機器數的形式值不等於真正的數值

例如上面的有符號數 1111 1101,其最高位1代表負,其真正數值是 -3 而不是形式值253(1111 1101按無符號整數轉換成十進制等於253)。

所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –0111 1111 = –127;這裡所說的比如-3二進制代碼為10000011,就是我們計算機裡面對-3表示的原碼碼。下面介紹原碼

在計算機內,有符號數有3種表示法:原碼、反碼和補碼。

最高位表示數的符號,其他位表示數值

無符號數:值:255 (最小值 0)到(255最大值)(正0)

有符號數:值:127 (最小值-128)到(127最大值)(負1)

3.原碼

概念:正數的原碼等於本身,顧名思義原碼就是原來的數

·例:

【+7】=00000111B 【-7】原=10000111B

+表示0 7——0表示符號位正——計算機字長是8位所以中間補夠8位0000——7二進制表示111——B代表這個數是二進制數】

8位二進制可表示[1111 1111, 0111 1111],即[-127, 127]

4.反碼

·概念:正數的反碼等於本身

例如:

【+7】原00000111B

【+7】反=00000111B

概念:負數的反碼是由其原碼的

符號位不變其餘位按位取反

原碼:【-7】原=10000111B

反碼:【-7】反=11111000B

5.補碼

概念:正數的補碼等於本身

儘管C標準並沒有指定某種有符號數的表示,但是幾乎所有的機器都使用二進制補碼。

【+7】原=00000111B【+7】補=00000111B

概念:負數的補碼是有其原碼的符號位不變,其餘位按位取反,在最低位加1

例如:

原碼:【-7】原=10000111B

補碼:【-7】補=11111001B

什麼是二進制的補碼?

補碼錶示法概念:正數的補碼與負數的補碼一致,負數的補碼符號位為1,這位1即是符號位也是數值位,然後加1

計算機組成原理(原碼、反碼、補碼)

模的概念:把一個計量單位稱之為模或模數。

理解補數“模”的概念,這會幫助你加深理解這三碼轉換的數學原理

例如,時鐘是以12進制進行計數循環的,即以12為模。

在時鐘上,時針加上(正撥)12的整數位或減去(反撥)12的整數位,時針的位置不變。14點鐘在捨去模12後,成為(下午)2點鐘(14=14-12=2)。從0點出發逆時針撥10格即減去10小時,也可看成從0點出發順時針撥2格(加上2小時),即2點(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射為+2。由此可見,對於一個模數為12的循環系統來說,加2和減10的效果是一樣的;因此,在以12為模的系統中,凡是減10的運算都可以用加2來代替,這就把減法問題轉化成加法問題了(注:計算機的硬件結構中只有加法器,所以大部分的運算都必須最終轉換為加法)。10和2對模12而言互為補數。同理,計算機的運算部件與寄存器都有一定字長的限制(假設字長為16),因此它的運算也是一種模運算。當計數器計滿16位也就是65536個數後會產生溢出,又從頭開始計數。產生溢出的量就是計數器的模,顯然,16位二進制數,它的模數為2^16=65536。在計算中,兩個互補的數稱為“補碼”。比如一個有符號8位的數可以表示256個數據,最大數是0 1 1 1 1 1 1 1(+127),最小數1 0 0 0 0 0 0 0 (-128);那麼第255個數據,加2和減254都是一樣的效果得出的結果是第一個數據 ,所以2和254是一樣的效果。對於255來說2和254是互補的數。

計算機組成原理(原碼、反碼、補碼)
負數在計算機中如何表示?

舉例來說,+8在計算機中表示為二進制的1000,那麼-8怎麼表示呢?

很容易想到,可以將一個二進制位(bit)專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個字節的最高位為符號位。那麼,+8就是00001000,而-8則是10001000。

但是,隨便找一本《計算機原理》,都會告訴你,實際上,計算機內部採用2的補碼(Two’s Complement)表示負數

求一個正數對應補碼是一種數值的轉換方法,要分二步完成:

第一步

每一個二進制位都取相反值,即取得反碼;0變成1,1變成0。比如,00001000的反碼就是11110111。

第二步

將上一步得到的反碼加1。11110111就變成11111000。所以,00001000的二進制補碼就是11111000。也就是說,-8在計算機(8位機)中就是用11111000表示。

不知道你怎麼看,反正我覺得很奇怪,為什麼要採用這麼麻煩的方式表示負數,更直覺的方式難道不好嗎?

計算機組成原理(原碼、反碼、補碼)

二進制補碼的好處

計算機內部用什麼方式表示負數,其實是無所謂的。只要能夠保持一一對應的關係,就可以用任意方式表示負數。所以,既然可以任意選擇,那麼理應選擇一種用的爽直觀方便的方式。

二進制的補碼就是最方便的方式。它的便利體現在,所有的加法運算可以使用同一種電路完成。

還是以-8作為例子。假定有兩種表示方法。

一種是直覺表示法,即10001000;另一種是2的補碼錶示法,即11111000。請問哪一種表示法在加法運算中更方便?隨便寫一個計算式,16 + (-8) = ?16的二進制表示是 00010000,所以用直覺表示法,加法就要寫成:

00010000

+10001000原碼形式-8

---------

10011000

可以看到,如果按照正常的加法規則,就會得到10011000的結果,轉成十進制就是-24。顯然,這是錯誤的答案。也就是說,在這種情況下,正常的加法規則不適用於正數與負數的加法,因此必須制定兩套運算規則,一套用於正數加正數,還有一套用於正數加負數。從電路上說,就是必須為加法運算做兩種電路。所以用原碼錶示負數是不行的。

現在,再來看二進制的補碼錶示法

00010000

+11111000補碼形式-8

---------

100001000

可以看到,按照正常的加法規則,得到的結果是100001000。注意,這是一個9位的二進制數。我們已經假定這是一臺8位機,因此最高的第9位是一個溢出位,會被自動捨去。所以,結果就變成了00001000,轉成十進制正好是8,也就是16 + (-8) 的正確答案。這說明了,2的補碼錶示法可以將加法運算規則,擴展到整個整數集,從而用一套電路就可以實現全部整數的加法。

二進制補碼的本質,本質是用來表示負整數的

在回答二進制補碼為什麼能正確實現加法運算之前,我們先看看它的本質,也就是那兩個求補碼步驟的轉換方法是怎麼來的。下面描述了一個正數怎麼求它對應負數在計算機的表達方式。比如128,正數為10000000,但是驚奇的發現-128也是10000000。但是這裡由於屬於數據類型的限定,第八位同樣一個1代表不同的含義,前面的 1是數值位,後面數的 1是符號位。

要將正數轉成對應的負數,其實只要用0減去這個數就可以了。比如,-8其實就是0-8。用模數的概念解釋如下圖

計算機組成原理(原碼、反碼、補碼)

已知8的二進制是00001000,-8就可以用下面的式子求出:

00000000

-00001000

---------- - - -

因為00000000(被減數)小於0000100(減數),所以不夠減。請回憶一下小學算術,如果被減數的某一位小於減數,我們怎麼辦?很簡單,問上一位借1就可以了。

所以,0000000也問上一位借了1,也就是說,被減數其實是100000000,這是重點;算式也就改寫成:

100000000

-00001000

---------- - -

11111000

進一步觀察,可以發現可分拆為100000000 = 11111111 + 1,所以上面的式子可以拆成兩個:

11111111

-00001000

---------

11110111取反

+00000001加一

---------

11111000

二進制的補碼兩個轉換步驟就是這麼來的。

舉個例子比如-128補碼的由來,先把正整數128二進制表示出來10000000求-128的補碼

1 1 1 1 1 1 1 1

-1 0 0 0 0 0 0 0

---------

0 1 1 1 1 1 1 1

+0 0 0 0 0 0 0 1

---------

1 0 0 0 0 0 0 0

即-128的補碼是10000000。8位的結構能表示的最小數是-128;

計算機組成原理(原碼、反碼、補碼)

有些內容來自於:https://blog.csdn.net/jq_ak47/article/details/45338061

二進制加減乘除原理:https://blog.csdn.net/lyt_angularjs/article/details/80613228

本期內容就結束了,喜歡的話點贊評論轉發收藏加關注哦!

作者: TianshiyuMogui


分享到:


相關文章: