挑戰408——組成原理(3)——原碼,補碼,反碼
計算機中的資料分為數值資料和非數值型資料(如聲音,影象等等)。我們接下來主要談的是數值型資料。
在現實的生活中,數值資料主要分為實數和整數兩大類,在計算機中,整數用定點數表示,實數用浮點數表示,而所有帶符號的整形都用補碼錶示。目前通用計算機中浮點數大多數採用IEEE754標準,其中尾數採用定點原碼錶示,所以浮點數的算術運算涉及原碼的加減乘除運算。
無符號數與有符號數
無符號數,即沒有正負號的數,是數的絕對值,在其面前添上正負號,便成了有符號的數。計算機的數均存放在暫存器中,通常我們稱暫存器的位數為機器字長,當存放有符號數的時候,需要佔用以為存放符合位,所有,如若機器字長為16位,那麼:
- 無符號數可表示的範圍為 0 — 2^(16) -1
- 有符號數可表示的範圍為 -2^15 — 2^(15) - 1
15次方是因為符號位佔用了一位。
那麼計算機如何表示有符號數呢?我們規定,用0表示正號,用1表示負號,這樣符號也就被數字化了,並規定放在有效資料之前,例如:
+0.1011 在機器中表示為0(小數點位置)1011
-1100 在機器中表示為1,1100(小數點位置)
為了方便區分手寫的數和將符號數字化的數,我們把前者稱為真值,後者稱為機器數。即
-1100(真值) -> 11100(機器數)
將符號數字化以後帶來了新的問題,運算時,符號位是否參與運算,如果是,那麼如何處理?為了處理好這些問題,於是就引入了原碼,補碼,反碼和移碼等編碼方式。
原碼
原碼,又稱帶符號的絕對值表示,符號位為0表示正,為1表示負。用大白話來講,就是直接將數值部分寫成二進位制數然後前面添上0或者1,用來表示正負號。
其實上面的公式我們只需要瞭解即可,實際的轉換很簡單
比如X = +1110時 [X]原 = 0,1110
X = -1110時 [X]原 = 1,1110 (逗號只是為了區分符號位實際不存在)
X = 0.1101時 [X]原 = 0.1101
X = -0.1101時 [X]原 = 1,1110(注意不是10.1101,因為0並不是有效資料位)。
注意:
- 若字長為n+1,那麼原碼整數的表示範圍為:
- 原碼中0的表示方式有兩種:
補碼
如果說是這幾種碼制中最重要的編碼方式,一點也不為過。計算機中存放的數值方式大多數是用補碼存放,計算(尤其是減法做加法運算時)時也通常採用補碼運算方式,因此要對補碼非常敏感。
對於純整數:
對於純小數:
而對於0而言,
具體的例項不舉先,先看看我們的反碼,我們沒有必要按上面的數學公式往上套。
反碼
反碼,通常用來由原碼求補碼或者由補碼求原碼的過渡環節。
我們先看看數學定義:
對於純小數:
對於純整數:
所以,記住上面的就夠了,我們具體看看運算過程,取反操作就是將原碼中的0換成1,1換成0.就完事了。
當X = +1101時,X反 = 0,1101
當X = -1101時,X反 = 1,0010(當為負數的時候,符號位不變,數值位執行取反操作)
當X = +0.0110時,X反 = 0.0110
當X = -0.0110時,X反 = 1.1001
對於0來說,反碼的表示方式也有兩種(0,000或者1,111),這就自己去寫了。
三種碼制之間的關係(最重要)
前面的數學公式是應付表示範圍類的題目,那麼這些內容就是應付計算題的題目:
- 三種機器碼的最高位均為符號位,符號位與數值位用逗號隔開
- 當真值為正時,原碼補碼反碼錶示方式相同。
- 當真值為負時,三者表現都不同,但是符號位都用1表示,補碼可以用“原碼求反(不含符號位)後加1”求得。而反碼是原碼除了符號位以外的部分都進行取反操作。
下面舉個簡單的計算例子:
移碼
當真值用補碼錶示的時候,由於符號位與數值位一起編碼,這與習慣上表示不同,我們很難從補碼形式上直接判斷真值的大小。但是如果對每個真值位(注意不包含符號位),都加上一個2^n(n為整數位),那麼在數軸上,移碼錶示的範圍恰好對應真值在數軸上移動2的n次方個單元。所以叫做移碼。
它常常用來表示浮點數的階數,因為它只能表示整數。
對於移碼來說,0的表示是唯一的,假設字長為6位(含一個符號位)那麼0的表示為:
+0移 = (2^5) + 0 =1,00000
-0移 = (2^5) - 0 =1,00000
特點:
- 0 的表示方式唯一
- 對於同一個真值,移碼和補碼相差一個符號位,且相反,例如:-11110 補碼為1,00010,移碼為:000010
- 引入移碼是為了直觀的判斷真值大小,所以移碼大,真值就大