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

《漫談計算機組成原理》這個系列的文章共分爲兩個部分。第一部分圍繞着計算機主機的外圍硬件,包括總線、存儲器、輸入輸出系統等,這部分的內容已經完成,感興趣的能夠看看以前的文章。以前凡是涉及到CPU的內容,除了第一篇簡要的介紹過CPU的工做意外,其餘文章都是默認將CPU做爲一個「黑盒子」,不涉及到CPU內部的邏輯、運算等問題。而從這篇文章開始,咱們將重點講述CPU的邏輯、運算、信息處理等的相關知識點。接下來的幾篇文章都是寫計算機的運算方法的,第一篇文章我着重介紹幾個概念——原碼、反碼、補碼及移碼,後面的文章就展開看CPU到底是如何被用來計算的。好了,話很少說,開始後半部分的第一講吧!微信

概述

咱們固然知道,計算機只能識別0和1,也就是咱們所說的機器語言。因此在程序猿進化史中出現過一種很是NB的品種——機器語言程序猿,他們的程序是寫在紙帶上面的。可是這種生物存在的時間不長(我不知道還有沒有真正意義上的機器語言程序猿),就被編譯器取代了。由於計算機只能識別0和1,因此在計算機的運算過程當中,參與運算的必然只有0和1兩個數字。那麼這小小的0和1,到底是如何完成如此複雜多變的操做的呢?cdn

機器數與真值

在說原碼以前,咱們必須提一下計算機中參與運算的兩類數(由0和1組成的「數字」),無符號數和有符號數。無符號數就是沒有符號的數,如0001,有符號的數就是有符號的數,如+1000一、-0010等。此外,**無符號數和有符號數的表示範圍並不相同,無符號數表示的範圍是0 ~ 65535,即0~ 2^16^ -1;有符號數的表示範圍是-32768 ~ +32767,雖然範圍不一樣,可是表示的數據都是2^16^個。**除此以外,無符號數和有符號數的另外一個重要的不一樣點就是在寄存器中的存放方式:無符號數能夠直接存放在寄存器中,可是有符號數是有符號位的,因此須要連同符號位一塊兒保存在寄存器中。+和-是兩種狀態,0和1也是兩種狀態,因此+對應0,-對應1,存儲到寄存器中就很簡單了。 【注】原碼、反碼、補碼、移碼均屬於有符號數。blog

原碼

原碼能夠說是計算機中最簡單的、也是一種最基本的數據表達形式,好比-0001,符號位是-,因此第一位就是1,而真值位就是-0001的絕對值,即0001,因此-0001的原碼就是10001。 由於原碼多是整數的原碼,也有多是小數的原碼,這就形成了一個問題——**該如何表示原碼中的小數點,即使是整數也有小數點。**整數的原碼很好表示,符號位和真值位之間由逗號分割,小數位在真值後,能夠不寫出來,即表示爲1,0001。至於小數的原碼,小數點就表示爲小數點。如-0.11001,表示爲1.11001原碼錶示方式的總結 教科書式的表示方式是在是讓人眼花繚亂(我的認爲),我在這裏直接用文字表述原碼的表示方式。編譯器

  • 整數的原碼錶示:符號位若是是+,則直接在真值的絕對值前加上符號位0和「,」;符號位若是是-,則直接在真值的絕對值前加1和「,」
  • 小數的原碼錶示:符號位若是是+,則直接在真值的絕對值前加上符號位0和「.」;符號位若是是-,則直接在真值的絕對值前加1和「.」

補碼

你可能沒有聽過補碼,可是確定聽過補角。若是說兩個角互補,那麼這兩個角的角度相加確定是180度的。以下圖所示: it

角A:120°,角B:60°,兩角之和爲180°。這就是補角的概念。 可是補碼和補角略有不一樣。補碼是一種有模的數據,是有正負的。如:當前鐘錶表示時間爲6:00,想要讓時間表示爲12:00,我既可讓時針逆時針調整6個小時,也能夠順時針調整6個小時,若是順時針記爲+,逆時針記爲-,則+6和-6所達到的效果是一致的。咱們就稱+6和-6是以12爲模的補數。因此,咱們可使用+6來代替-6,也能夠用+9來代替-3(一樣是12爲模)。 補碼也是一樣的道理,就是用一個正數來替代一個負數。爲啥要這樣作呢?由於這能夠減小一種運算,就是減法運算。這樣就可使計算機的運算,不論加減,都能當作加來運算。可是乘除不能轉換。 關於補碼的表示,規則以下:io

  • 正數的補碼是其自己(實際上,正數的補碼、原碼、反碼都是其自己)
  • 負數的補碼:運算方式--->符號位保持不變,其他爲取反,末位+1 如:-100100的補碼爲:除符號位各位取反1,011011;末位+1:1,011011+1 = 1,011100.因此1,011100就是最終的結果

反碼

反碼存在的意義:在原碼和補碼的互相轉換過程當中起到一個過渡的做用。 反碼的表示更加簡單:編譯

  • 正數的反碼錶示:其自己
  • 負數的反碼錶示:除符號位不變,其他位各位取反(你們能夠找個數字嘗試一下)

移碼

移碼頗有用,具體做用就是比較大小。 下面兩個數:1,0001和0,0001,判斷大小。乍一看,好像是1,0001>0,0001。可是你別忘了,1,0001但是負數…… 這個問題就很是好玩了,這種簡單的數對於人其實還好判斷一些,可是對於計算機,他並不能像人同樣思考。 若是咱們這樣作:將1,0001和0,0001都加上一個0,1111,最終的結果都成爲符號相同的數了,確定是很是比如較的了。 因此,[x]~移~ = 2^n^ + x(x是真值,n是整數x的位數,小數沒有移碼) 這樣,咱們就能很好的判斷數據的大小了。 若是你親自計算了,你會發現:正整數的移碼和補碼只相差了一個符號位。class

總結

這篇文章是後續文章的基石,相對簡單。你們只須要記住數據的原碼、反碼、補碼的運算便可,移碼屬於瞭解範疇。 若是你喜歡個人文章,歡迎關注微信公衆號:最高權限比特流。 原理

相關文章
相關標籤/搜索