1. 機器數和真值
二進制數有正負之分,如N1=+0.101101,N2=-0.101101,則N1是個正數,N2是個負數。機器不能直接把符號“+”、“-”表示出來,爲了能在計算機中表示正負數,必須引入符號位,即把正負符號也用1位二進制數碼來表示。把符號位和數值位一起編碼來表示相應的數的表示方法包括:原碼、補碼、反碼、移碼等。
爲了便於在計算機中表示,同時又便於與實際值相區分,在此首先引入機器數和真值的概念。
機器數 用二進制數“0”或“1”來表示數的符號,“0”表示正號,“1”表示負號,且把符號位置於該數的最高數值位之前,這樣表示的數稱爲機器數(或稱機器碼),即把符號位和數值位一起編碼來表示的數就是機器數。
真值 一般書寫中用“+”、“-”來表示數的符號,這樣表示的數稱爲真值。
例如:N1 = +0.101101,N2 = -0.101101,這是真值,表示成機器數(以原碼爲例)就是[N1]原= 0.101101,[N2]原 = 1.101101。
機器數有原碼、補碼、反碼和移碼四種表示形式。下面以整數爲例說明原碼、補碼、反碼和移碼的表示方法。
2. 原碼
符號位爲0表示正數,爲1表示負數,數值部分用二進制數的絕對值表示的方法稱爲原碼錶示法,通常用[X]原表示X的原碼。
例如,要表示+59和-59的原碼。假設機器數的位數8位(即機器的字長爲8位),最高位是符號位,其餘7位是數值位,那麼,+59和-59的原碼分別表示爲:
[+59]原=00111011 [-59]原=10111011
寫成一般式則爲:
正數的原碼 [X]原=X (0<X<2n-1)
負數的原碼 [X]原=2n-1-X (-2n-1<X<0)
注意:0的原碼有兩個值,有“正零”和“負零”之分,機器遇到這兩種情況都當作0處理。
[+0]原=00000000 [-0]原=10000000
原碼的表示方法簡單易懂,與真值轉換方便,但在進行加減法運算時,符號位不能直接參加運算,而是要分別計算符號位和數值位。當兩數相加時,如果是同號,則數值相加;如果是異號,則要進行減法運算。而在進行減法運算時,還要比較絕對值的大小,然後用大數減去小數,最後還要給運算結果選擇恰當的符號。
爲了解決這些問題,人們引進了數的補碼錶示法。
3. 補碼
什麼是補碼?我們先用日常生活中的實例來進行說明。假如現在時間是7點,而你的手錶卻指向了9點,如何調整手錶的時間?有兩種方法撥動時針,一種是順時針撥,即向前撥動10個小時;另一種是逆時針撥,即向後撥2個小時。從數學的角度可以表示爲:
(9+10) -12=19-12=7
或 9-2=7
可見,對鐘錶來說,向前撥10個小時和向後撥2個小時的結果是一樣的,減2可以用加10來代替。這是因爲鐘錶是按12進位的,12就是它的“模”。對模12來說,-2與+10是“同餘”的,也就是說,-2與+10對於模12來說是互爲補數的。
計算機中的加法器是以2n爲模的有模器件,因此可以引入補碼,把減法運算轉換爲加法運算,以簡化運算器的設計。
補碼的定義:把某數X加上模數K,稱爲以K爲模的X的補碼。
[X]補=K+X
因此,正數的補碼的最高位爲符號“0”,數值部分爲該數本身;負數的補碼的最高位爲符號“1”,數值部分爲用模減去該數的絕對值。
通過用模2n減去某數的絕對值的方法來求某數的補碼比較麻煩,求一個二進制數的補碼的簡便方法是:正數的補碼與其原碼相同;負數的補碼是符號位不變,數值位逐位取反(即求其反碼),然後在最低位加1。
例如,[+59]補=[+59]原=00111011,而[-59]原=10111011,因此,[-59]補= 11000100+1 = 11000101。
注意:0的補碼只有一種形式,就是n位0。
採用補碼錶示法進行加減法運算,比原碼運算方便多了,符號位可以和數值位一起參加運算,而且不論數是正還是負,計算機總是做加法,減法運算可轉換爲加法運算。
4. 反碼
引入反碼的目的是便於求負數的補碼。
正數的反碼與原碼相同,負數的反碼是符號位不變,數值位逐位取反。
例如:[+59]反=[+59]原=00111011,而[-59]原=10111011,因此,[-59]反=11000100。
注意:0的反碼也有兩個,[+0]反=00000000,[-0]反=11111111
在計算機中,求一個數的反碼很容易,因此,求一個數的補碼也就易於實現。
採用補碼運算,計算機的控制線路較爲簡單,所以,目前大多數計算機均採用補碼存儲、補碼運算,其運算結果仍爲補碼形式。
綜上所述,在n位機中,用n位二進制數補碼錶示一個帶符號的整數時,最高位爲符號位,後面n-1位爲數值部分。n位二進制數補碼錶示的範圍爲-2n-1~+2n-1-1。例如,在8位機中,補碼錶示的範圍爲-128~+127。
表2-2列出了8位二進制數碼在各種表示形式下的對應真值。
表2-2 8位二進制數的各種表示方法
5)移碼
移碼也稱爲增碼或偏碼,常用於表示浮點數中的階碼。
移碼可由補碼求得,只要把補碼的符號位取反就得到了移碼。
轉載自:http://share.onlinesjtu.com/mod/tab/view.php?id=173