1. 程式人生 > >計算機中的數制與編碼

計算機中的數制與編碼

目錄

原碼:

反碼:

補碼:

轉換:

資訊編碼:

目前,計算機中通常用補碼進行帶符號數的運算。

  • 原碼:

最高為為符號位(0/1),其餘數字位表示數的絕對值。

當機器字長為8時,-127原碼11111111B +127原碼01111111B 可以看出8位二進位制原碼錶示數的範圍是-127~+127.

原碼錶示簡單直觀,且與真值的轉換很方便,但是不便於在計算機中進行加減運算。如兩數相加,必須先判斷兩個數的符號是否相同。如果相同則進行加法運算,否則進行減法運算。如進行兩數相減,必須比較兩數的絕對值大小,再由大數減去小數,結果的符號要和絕對值大的數的符號一致。按上述運算方法設計的算術運算電路很複雜。因此,計算機中通常使用補碼進行加減運算,這樣就引入了反碼錶示法和補碼錶示法。

  • 反碼:

正數的反碼與其原碼相同,負數的反碼是在原碼的基礎上,符號位不變,數值位按位取反。

8位二進位制反碼錶示數的範圍是-127~+127.

  • 補碼:

正數的補碼與其原碼、反碼相同。負數的補碼是在原碼基礎上,符號位不變,數值位按位取反,末位+1;或者在反碼基礎上末位+1.

8位二進位制補碼錶示數的範圍是-128~+127

  • 轉換:

原碼轉換為真值:由符號位決定數的正負,數值位各位按權展開求和。

反碼轉換為真值:先求出反碼對應的原碼。再按原碼轉真值的方法求。

補碼轉換為真值:先求出補碼對應的原碼。整數原碼補碼相同,負數的原碼是在補碼的基礎上再次求補。

  • 補碼的加減運算:

補碼加法:x補 + y補 = [x + y]補 

當最高位向更高位的進位由於機器字長的限制而自動丟失時,不會影響計算結果的正確性。

當結果不超出補碼錶示的範圍,計算結果便是正確的補碼形式。當計算結果超出補碼的表示範圍,結果就不正確了,這種情況稱溢位。

判斷溢位的方法:

通過參加運算的兩個數的符號以及運算結果的符號進行判斷

單符號位法

雙符號位法

這裡說一下單符號位:利用溢位標誌位OF判斷,OF=CF∀DF==1?溢位:未溢位。CF表示符號位向前進位?1:0,DF表示數值部分最高位向前有進位?1:0。

補碼減法:x補 - y補 = x補 + [-y]補 = [x - y]補

同樣當最高位向更高位的進位由於機器字長的限制而自動丟失時,不會影響計算結果的正確性。

計算機中帶符號數用補碼錶示時的優點:

可以將減法運算變為加法運算,因此可以使同一個運算器實現加法和減法的運算,簡化了電路。

無符號數和帶符號數的加法運算可以用同一個加法器實現,結果都是正確的。

  • 資訊編碼:

雖然二進位制數對計算機來說是最佳的數制,的那人們卻不習慣用它,為了解決矛盾,人們提出一個比較適合於十進位制系統的二進位制編碼的特殊形式,即1位十進位制的0-9這十個數字分別用4位二進位制碼的組合表示,在此基礎上對任意十進位制數進行編碼。這就是二進位制編碼的十進位制數,簡稱BCD碼。BCD碼有兩種形式,即壓縮型BCD碼和非壓縮型BCD碼。

但雖然BCD碼可以簡化人機練習,但是比純二進位制編碼效率低,對同一個給定的十進位制數,用BCD碼錶示的需要的位數比純二進位制碼多,運算花費時間也多過程更復雜。由於計算機總是將數當作二進位制來運算,所以結果可能出錯,因此需要對計算結果進行必要的修正,才能使結果成為正確的BCD碼形式。

 修正規則:

如果兩個對應位BCD數相加的結果向高位無進位,且結果小於或者等於9,則該位不需要修正;若得到的結果大於9而小於16,則該位需要加6修正;

如果兩個對應位BCD數相加的結果向高位有進位,則該位需要加6修正。

原因:十進位制數相加應該是”逢十進一“,而計算機按二進位制數運算,每四位為一組,低四位向高四位進位與十六進位制數低位向高位進位的情況相當,是逢”十六進一“,所以當相加結果超過9將比正確結果少6,結果出錯。