理解二進位制原碼、反碼、補碼

飛馳的蝸牛發表於2019-10-03

一、什麼是二進位制

  在說二進位制之前,我們先回想下平常我們用的最多的十進位制,1,0,50,-100,899等等這些數字我們在熟悉不過了,牽扯到我們的衣食住行方方面面。組成十進位制的數字符號集合為{0,1,2,3,4,5,6,7,8,9}共十個元素。十進位制的運算規則為:  1.“滿十進一,借一當十”  2.按位權展開,第一位權為10^0, 第二位位權為10^1 ……以此類推,第N位10^(N-1),這也是就是我們說的位置化數字系統,在數字中符號所佔據的位置決定了其表示的值  例如,十進位制數字698的位置化表示:

698
  這裡我們看到,位權中的基數跟進位制的符合集合個數有關,十進位制有0~9共十個符號,所以十進位制的位權基數為10,基數的冪從0開始到n-1。   有了十進位制的鋪墊,那麼二進位制理解起來就不會那麼難了。二進位制是計算機儲存程式和資料的標準形式,二進位制的符號集為{0,1},所以二進位制只能以0、1的組合去表示數字,類比十進位制規則,它的規則則是:   1.滿二進一,借一當二   2.按位權展開,基數為2,第一位權為2^0, 第二位置位權為2^1 ……以此類推,第N位2^(N-1),同樣遵循位置化數字系統規則  例如,數字6的二進位制表示為110:
6
  十進位制如何轉換二進位制呢?   十進位制轉換為二進位制很簡單,使用十進位制數除以2取餘數,直到商為0,所得的餘數倒序排列。   例如我們將十進位制的數字8轉換為二進位制表示的運算過程:
8

二、原碼

   儲存到計算機之中的資料都被轉換為了二進位制形式,但是還有問題需要解決:如何儲存數字的符號?    如果不考慮數字的符號,對於n位儲存單元,所能儲存的範圍為[0~2^n-1],例如n=4時,它能表示的範圍就是0 ~ 15。    但我們都知道,數字有正數、負數之分,因此原碼表示法規定了,在n位的儲存單元中,使用最左1個二進位制位表示符號0表示正1表示負其餘位置表示數字的絕對值。    例如n=4的儲存單元,所能儲存的無符號數範圍為[0~2^n-1],最左位當做符號位置後,可以僅用剩餘3位表示數字的絕對值。

原碼錶示
   從上圖我們可以看到n=4位的儲存單元,使用原碼錶示法時,被分為了兩個相等的子範圍即是正整數0000 ~ 0111和負整數1000 ~ 1111。    所以總結起來原碼表示法,n位的儲存單元可儲存數字範圍為-(2^n-1 - 1)至 +(2^n-1 - 1),並且原碼錶示法中有兩個0+0-0

三、反碼

   原碼在計算機儲存整數中並不常用,計算機使用二進位制補碼來表示n位儲存單元中的有符號整數反碼是由原碼轉換為補碼的中間形式,該運算可以應用到任何整數,無論是正的還是是負的,進行反碼運算時,最左邊符號位保持不變,當此數字為負數時,其絕對值位各位求反;正數反碼為這個數本身    例如n=4位儲存單位中數字3的反碼:

3的反碼
   -3的反碼:
-3

四、補碼

   幾乎所有計算機都使用使用二進位制補碼來表示n位儲存單元中的有符號整數。那麼如何獲得一個數補碼,規則很簡單:    正數的補碼為其本身;    負數的補碼為其反碼在加上1得到的結果

 例如在4位的儲存單位中,-5的補碼錶示:

在這裡插入圖片描述

例如在n=4位的儲存單元中,還原1 0 1 1所表示的整數:

在這裡插入圖片描述

 所以總結起來,計算機以二進位制補碼儲存正數遵循以下步驟:   ①將整數轉換為n位的二進數   ②如果整數是正數或零,以其原樣儲存,如果是負數,計算機取其補碼。  而從二進位制補碼還原為整數,遵循如下步驟:    ①如果最左位是1,計算機取其補碼。如果是0,不進行任何操作    ②將該整數轉換為十進位制

四、為什麼使用補碼

   計算機採用二進位制補碼錶示的優點在於加法和減法之間沒有區別,當遇到減法運算時,計算機可以簡單的把它轉變為加法,只需要求為第二個數求二進位制的補碼即可這樣符號位就能參與運算,降低了計算機邏輯電路複雜度。   例如在n=4位儲存單元,計算機計算5-3時,可以按照5+(-3)處理

補碼計算
得到結果0010按照補碼->十進位制整數轉換規則,結果是2   補充:二進位制補碼加法與十進位制加法一樣,列與列相加,滿二進一,如果有進位,就加到下一列,但是最後一列進位要捨棄(圖中的紅色標識的1)。

相關文章