現(xiàn)在很多程序員,只是會用計算機編程,但是許多基礎的知識卻很薄弱。今天就跟大家說說碼制的問題。計算機對數(shù)據(jù)做的讀取、傳輸、運算、顯示等操作,都離不開碼制。常見的編碼方式有:原碼、反碼、補碼、移碼、BCD碼。我們一一說道。
【原碼】
表示:最高位為符號位(0表正,1表負),其余各位為數(shù)的絕對值。
舉例: [+11]原 =00001011 。 [-11]原 = 10001011 。
范圍:-127~+127
優(yōu)點:乘除法操作比較簡單
缺點:0有2種表示方法, [+0]原 =00000000, [-0]原 =10000000 。加減法運算可能會出現(xiàn)溢出錯誤。
錯誤再現(xiàn):(1)10 + (1)10 = (0)10 ,用原碼表示的: (00000001)2 + (10000001)2 = (10000010)2 = (-2)10
錯誤原因:原碼的符號位不能直接參與運算,否則可能會出現(xiàn)錯誤。
為了解決原碼的加減法缺陷,引入了一個新的編碼——反碼。
【反碼】
表示:由原碼轉換而來,正數(shù)跟原碼一致;負數(shù),符號位不變,其余各位按位取反。
舉例: [+11]反 = [+11]原 =00001011 。 [-11]反 = 11110100 。
范圍:-127~+127
優(yōu)點:符號位可以直接參與運算。減法可以變?yōu)榧臃ㄟ\算。
缺點:0有2種表示方法, [+0]反 =00000000, [-0]反 =11111111
錯誤再現(xiàn):(1)10 + (1)10 = (0)10 ,使用反碼的結果是: (00000001)2 + (11111110)2 = (11111111)2 = (-0)10
本欄目更多精彩內(nèi)容:http://www.bianceng.cn/Programming/hb/
解決了加減法缺陷,還需要解決0編碼的問題,遂又引入了一個新的編碼——補碼。
【補碼】
表示:由反碼轉換而來,正數(shù)跟原碼一致;負數(shù),反碼+1。
舉例: [+11]補 = [+11]原 =00001011 。 [-11]補 = 11110101 。
范圍:-128~+127
優(yōu)點:符號位可以直接參與運算。減法可以變?yōu)榧臃ㄟ\算。0有唯一編碼, [+0]補 =[-0]補 =00000000 。
現(xiàn)在 (1)10 + (1)10 = (0)10 ,用補碼表示的: (00000001)2 + (11111111)2 = (00000000)2 = (0)10,結果正確。
溢出判斷:兩個正數(shù)相加,如果符號位變?yōu)?,則溢出。兩個負數(shù)相加,符號位變?yōu)榱?,則溢出。正數(shù)+負數(shù)則不會溢出。
【移碼】
表示:跟補碼數(shù)值位一樣,但符號位取反。
舉例: [+11]移 = 10001011 。 [-11]移 = 01110101 。
范圍:-128~+127
【8421BCD碼】
表示:十進制數(shù)每位都用4位2進制數(shù)表示 。
舉例: 43 => 0100 0011 。
優(yōu)點:容易讀數(shù),二進制和十進制的轉換快捷,適用于會計系統(tǒng)。
溢出修正:結果>=9,則+6,進1 。如3+5:0011 + 0101 = 1000 正確。6+7:0110 + 0111 = 1101,結果需修正,1101+0110 = 10011 =(13)10