操做系統之原碼、反碼、補碼、移碼的雜談

序言

本文隨便聊一下計算機表示數據的方式,也算是總結一下以便未來回顧。若有紕漏錯誤請高人指點、共同進步。編碼

  • 計算機中的數值表示
    任何數據在計算機中都是以二進制機器碼的形式存在的,舉個例子現實生活中的+2在機器中表示爲00000010(姑且假設這個計算機的字長定義爲8位)。但這是+2對應的機器碼,由於首位是用來表示數值的正負的:0爲正1爲負。因此若是想表示-2的話則是對應的機器碼爲10000010,因此看見一串機器碼的時候首先考慮值的正負,10000010若是直接按權展開計算其真值是不對的,若是直接按權展開是1*2^7 + 1*2^1 = 130 顯然不是2。由於首位是1,因此爲負值,而後計算後面位按權展開結果爲-2。
  • 原碼
    像上段文中舉例那樣,用機器碼錶示出來的值稱爲原碼,+2的原碼就是00000010,-2的原碼是10000010。
  • 反碼
    反碼通常狀況下是計算機用處最少用到的表示方式,爲何稍微會談到,先說下反碼怎麼表示:若是是正數的反碼則是原碼自己,沒什麼變化。若是是負數的反碼,則是符號位也就是第一位上的數值不變,其他位取反。好比+2的原碼 00000010,那麼+2的反碼也是00000010。-2的原碼錶示10000010,反碼即爲11111101。
  • 補碼
    補碼是計算機的數值運算中用到最多的一種編碼方式,具體緣由稍微會聊。先說下補碼的表示方式,正數的補碼就是原碼自己,這點跟反碼是同樣的。負數的補碼是其反碼+1後的結果。好比+2的補碼就是00000010。而-2的補碼:11111101(反碼)+1 = 11111110。
  • 移碼
    移碼是將數值加上一個偏置常數。當編碼位數爲n時,一般狀況偏移2的n-1次方。好比-2的移碼 = 原碼+2的7次方 = 00000010 + 10000000 = 10000010,能夠當作-2的補碼11111110符號位不變其他位取反後+1
  • 爲何有補碼和反碼?
    模運算系統
    拿生活中的鐘表計時方式來講,10點若是變成6點能夠往回撥4,10-4=6。也能夠順時針撥8,10+8=18模12=6。能夠看出來關於模12,-4和+8是相等的。8就是4關於模12的補碼。這樣的話能夠把全部的減法計算轉化成加法運算。
    若是是「4位的十進制」模系統運算中,9828-1928運算至關於9828 + (10^4-1928)= 9828+8072 = 17000,取10^4模 = 7000。因此計算機中運算減法的時候,是至關於加上 -1928的補碼進行運算的。
    其實咱們人腦直接用原碼進行數值計算是最直觀和最簡單的,爲何計算機不能直接用數值的原碼去進行計算,由於有一個很重要的運算因素存在----負數。咱們知道原碼的首位是表明符號位0表明正數1表明負數,可是計算機不知道。若是計算1+(-1)那麼結果是00000001(+1原碼)+10000001(-1原碼) = 10000010(原碼) = -2 很明顯結果是不對的
    那麼反碼的誕生是否解決了這類的問題?來試試 。1+(-1)= 00000001(原) + 10000001(原) = 00000001(反)+11111110(反) = 11111111(反) = 10000000(原) = -0 注意這裏的0是有符號位的是個負值。這與咱們數學運算規則不符(雖然現實中0不分正負可是計算機中正確結果應該是+0)
    因而最後出現了補碼的編碼方式進行計算機運算,1+(-1)= 00000001(原) + 10000001(原) = 00000001(反)+11111110(反) = 00000001(補) + 11111111(補) = 00000000(補) = 0,結果正確。
  • 爲何有移碼?

    移碼主要是爲了便於計算機運算指數而引進的,比咱們運算一個加法1.1*2^-1 + 1.2*2^3,根據運算規則來說底數2相同時,須要先把指數處理爲相同時才能進行1.1和1.2的加法運算。0.00011*2^3 + 1.2*2^3這樣運算就簡單多了。因此爲了進行運算就須要比較指數部分,指數-1和3進行比較是若是是原碼編碼的方式去處理,就會造成10000001和00000011進行比較的結果,顯然這麼一比是-1>3的,計算機沒法進行準確運算。若是用移碼的形式,好比讓指數-1和3同時+4,就成了3和7的比較,很容易進行比較出來大小方便對齊最大冪進行運算。因此移碼的思想就是這樣由來的。code

相關文章
相關標籤/搜索