?計算機中的數據分為數值數據和非數值型數據(如聲音,圖像等等)。我們接下來主要談的是數值型數據。 在現實的生活中,數值數據主要分為實數和整數兩大類,在計算機中,整數用定點數表示,實數用浮點數表示,而所有帶符號的整形都用補碼錶示。目前通用計算機中浮點數大多數採用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並不是有效數據位)。

注意: 1. 若字長為n+1,那麼原碼整數的表示範圍為:

2. 原碼中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」求得。而反碼是原碼除了符號位以外的部分都進行取反操作
  • 其中0在移碼和補碼中的表示方式都是唯一的

下面舉個簡單的計算例子:

移碼

當真值用補碼錶示的時候,由於符號位與數值位一起編碼,這與習慣上表示不同,我們很難從補碼形式上直接判斷真值的大小。但是如果對每個真值位(注意不包含符號位),都加上一個2^n(n為整數位),那麼在數軸上,移碼錶示的範圍恰好對應真值在數軸上移動2的n次方個單元。所以叫做移碼。

它常常用來表示浮點數的階數,因為它只能表示整數。 對於移碼來說,0的表示是唯一的,假設字長為6位(含一個符號位)那麼0的表示為:

+0移 = (2^5) + 0 =1,00000

-0移 = (2^5) - 0 =1,00000

特點

1. 0 的表示方式唯一

2. 對於同一個真值,移碼和補碼相差一個符號位,且相反,例如:-11110 補碼為1,00010,移碼為:000010

3. 引入移碼是為了直觀的判斷真值大小,所以移碼大,真值就大


推薦閱讀:
相关文章