各種數值在計算機中表示的形式為機器數,其特點是採用二進位制計數制,數的符號用0或1表示,小數點則隱含,表示不佔位置,這就是機器數的原碼。為了便於運算,帶符號的機器數可採用原碼、反碼、補碼和移碼等不同的編碼方法,機器數的這些編碼方法稱為碼制。在這種表示方法中,最高為是符號位,0表示正號,1表示負號。
原碼就能夠表示乙個二進位制數了,為什麼要使用不同的編碼方法(反碼,補碼)?
有了數值的表示方法就可以對數值進行算數運算。
下面,我們先區分一下機器數和真值:
機器數:乙個數在計算機中的二進位制表示形式,如00001。
真值:除符號位,乙個二進位制數所表示的值。0000 0001的真值=+0000 0001=+1;1000 0001的真值=-0000 0001=-1而不是129
根據運算法則,減去乙個正數等於加上乙個負數,即1-1=1+(-1)=0
(1)10 = (1)10 + (-1)10 = (0)10=0
十進位制的1減十進位制的1等於十進位制的1加十進位制的-1等於十進位制的0,也就是0
原碼:(0000 0001)原+(1000 0001)原 = (1000 0010)原 = (-2) 與上面計算結果不同
當用原碼計算時,讓符號位也參與運算,顯然,結果是錯誤的。
反碼:(0000 0001) 反+(1111 1110)反 = (1111 1111)反 = (1000 0000)原=(-0) 與上面j計算結果不同
我們發現,當用反碼計算時,結果的真值部分是正確的,但是出現了-0的情況,在人們的意識裡,+0和-0是一樣的,但是0帶符號是沒有意義的,還會出現(0000 0000)和(1000 0000)兩種表示方式。
因此,反碼解決了負數加法運算的問題,將減法運算轉換為加法運算,從而簡化運算規則。
補碼:(0000 0001)補+(1111 1111)補=(0000 0000)補=(0000 0000)原=0與上面計算結果相同
使用補碼, 修復了0的符號以及存在兩個表示0的編碼的問題,彌補了反碼的不足。
移碼:原碼、反碼、補碼和移碼存在的差別?
我們以十進位制數+45和-45,機器字長為8舉例:
+45 -45
原碼00101101 10101101
正數原碼=其二進位制數 負數原碼=其二進位制數符號位取反
反碼00101101 11010010
正數反碼=原碼 負數反碼=原碼除符號位均取反
補碼00101101 11010011
正數補碼=原碼 負數補碼=反碼+1
移碼00101101 01010011
正數移碼=原碼 負數補碼=補碼符號位取反
總結:1.正數的原碼、補碼、反碼、移碼均為其二進位制數
2.負數的原碼、反碼、補碼、移碼轉換公式:
反碼=原碼(除符號位外)均取反
補碼=反碼+1
反碼=補碼-1
移碼=補碼符號位取反
當時軟考學習這部分內容的時候,只考慮了原碼、反碼、補碼、移碼之間的相互轉化,沒想過為什麼要有這麼多的編碼方式,今天查了下資料,花了一下午的時間研究,有了一點點成果。沒有無緣無故存在的事物,任何東西存在都是有他的價值的,懂得了這些,以後在學習其他東西的時候也可以問一問自己,為什麼要有這個東西呢?不能為了學習而學習,而是有自己的思考,這樣我們將會學到更多的知識。
原碼 反碼 補碼和移碼
原碼 如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二進位制數,其中最高位為符號位 正數為0,負數為1。剩下的n 1位表示概數的絕對值。例如 x 101011 x 原 00101011 x 101011 x 原 10101011 位數不夠的用0補全。ps 正數的原 反 補碼都一樣 0的原碼跟反碼...
原碼,反碼,補碼和移碼
注意 正數的原 反 補碼都一樣。0的原碼跟反碼都有兩個,因為這裡0被分為 0和 0。如果機器字長為n,那麼乙個數的原碼就是乙個n位的二進位制數有符號數,其中最高位為符號位 正數為0,負數為1。剩下的n 1位為數值位,表示真值的絕對值。凡不足n 1位的,小數在最低位右邊加零 整數則在最高位左邊加零來補...
原碼 反碼 補碼和移碼
數值型資料的表示方法 1.1 進製計數制 數制的基與權 在任一數制中,每乙個數上允許使用的計數符號的個數被稱作該數制的基數。每一位都對應乙個表示該位在數碼中的位置的值,這個值就被稱為數字的權值w。常用的幾種進製 1 2進製 0,1 2 8進製 0,1,2,3,4,5,6,7 3 17進製 0,1,2...