1. 程式人生 > >無符號數和有符號數(一) -- 原碼錶示法和補碼錶示法

無符號數和有符號數(一) -- 原碼錶示法和補碼錶示法

無符號數:

即沒有符號的數。 在c語言中就是 unsigned 型別的。 無符號數在計算機中的儲存較為簡單, 因為沒有符號位, 直接將數字化成二進位制然後儲存在對應的儲存器或者暫存器中。 這時暫存器或者儲存器的位數就可以表示數值的範圍, 比如:如果是 8 位的, 表示的範圍為 0 ~ 255。

有符號數:

即有符號的數, 符號數儲存時不僅要將資料部分存入計算機, 還要將符號數字化的存進去。

1, 機器數和真值

機器數就是在計算機裡面儲存的數, 真值是帶符號的數。

在以上資料的表示中, 一共需要解決三個問題:第一是符號位的表示; 第二是數值部分的表示; 第三是小數點位置的表示。

注意:在計算機裡面沒有專門的硬體是用來表示小數的, 小數都是以約定的形式給出的, 比如放在符號位的後面; 符號位也是如此, 比如約定用最高位來表示符號位。 根據這種方式可以將定點計算機(小數點固定的計算機)分為整數定點機(小數點在最後面)和小數定點機(小數點在符號位後面)。實際上將符號位數值化這種表示方式就是原碼錶示法。

二, 原碼錶示法

1, 整數

n 為數值位的位數, x 是真值。 當 2^n >= x >= 0; 時, 符號位為 0(0 表示正, 1 表示負)。當 0 >= x >= -2^n 時, 最高位

為 1, 因為數值位一共 n 位, 加上符號位一共 n+1 位, 所以 2^n 表示最高位為 1。 比如:

原碼錶示法就是帶符號的絕對值表示。 從上面的原碼錶示形式來看, 整數 0 有兩種不同的表示方法。

2, 小數

x 為真值。下面是兩個小數的具體例子

注意無論是整數的 “,” 還是小數的“ . ” 在計算機裡面都是不儲存的, 都是約定形成的。 還是小數 0 也有兩種不同的表示方式。

也就是說, 在原碼錶示法裡面, 0 有四種不同的表示方式

原碼的特點是簡單直觀。 但是原碼做加法操作時會出現以下問題:

也就是說, 對於兩個異號的數相加實際上還是進行減法操作, 這對運算器來說就比較麻煩, 能不能將減法轉換成加法?

這個用補碼可以解決。

三、補碼錶示法

(1)首先弄清楚“補”的概念。 在一塊能顯示0 ~ 12 的時鐘上面, 如果現在是 6 點, 現在想要調到 2 點, 有兩種方式; 第一種向後面撥 4 個小時,

二種向前面撥八個小時; 也就是 6 - 4 = 6 + 8, 在模為 12 的情況下; 我們稱 -4 是 8 以 12 位模的補數。如此可以將減法轉化成加法。 可以得到

以下結論:

一:一個負數加上“模”得到該負數的補數。

二:一個正數和一個負數互為補數時 ,它們絕對值的和為 “模”。

在計數器中, 模為 16. 如果我們需要將 1011 變成 0000 , 怎麼變換呢? 模為 16

第一種方式:1011 - 1011 = 0000

第二種方式:1011 + 0101 = 1 0000; 但是因為是在4 位暫存器裡面進行的, 所以高位 1 自動去除。

如果是負數呢? 比如 -0.1001變成 0.0000呢?, 在模為 2 的情況下

第一種方式: -0.1001 - (-0.1001) = 0.0000

第二種方式:-0.1001 + 1.0111 = 10.0000; 高位自動去除

(2)正數的補數為它本身

-1011 = + 0101 (mod 16); 在模為 16 的時候 - 1011 的補數為 + 0101, 將這兩個數同時加上 “模”, -1011的模為 + 0101, + 0101加上模之後它的

補數還是+ 0101(最高位會扔掉), 也就是說 - 1011和 + 0101 的補數都是 + 0101。 那麼+ 0101 到底是 -1011 還是 + 0101的補數呢? 可以用符號位

來加以區分:+ 0101 的 補數是 0,0101(0 表示正); - 1011的補數是 1,0101(1 表示 負)。

那麼這種方法是怎麼實現的呢?

實際上是將模 改成 2^5 。這樣 - 1011 + 100000 = 1,0101(符號位與數值位之間用逗號隔開)。 + 0101 + 100000 = 10,0101(最高位去除)

(3)補碼定義:

整數

x 為真值, 前面的 0 是符號位。n 為位數; 注意 模 為 n + 1。

舉例:

x = + 1011, 它的補碼為:0,1011。

x = - 1011000, 首先確定 n 等於 7, 所以 模 為2^8, 補碼為: 100000000 - 1011000 = 1,0101000

小數:

x 表示真值。

舉例:

x = 0.1110 補碼為:0.1110, 最高位表示符號位。

x = - 0.1100000 補碼為:1.0100000, 最高位同樣表示符號位

注意上面的 mod 2 (模為 2)並不是確定的。可以為 mod 4 (模為 4), mod 8(模 為 8); 但是如果不是mod 2 的話, 符號位也會變化。

從前面的求法可以看出, 負數的補碼求法略顯麻煩, 因為每次都要進行減法運算; 下面介紹一種比較方便的方法:

(4)求補碼的快捷方式

設 x = - 1010, 我們可以經過如下步驟得到 x 的補碼:

注意:此時的補碼為:1,0110; 原碼為:1,1010(負號用 1 表示)。 所以可以得到 補碼 = ! 原碼 + 1。

負數的補碼等於原碼的數值位取反加 1。 同樣 負數的原碼也是符號位不變, 補碼數值位取反加 1 。原碼 = !補碼 + 1.

這個比用公式快得多。

結論:補碼錶示法中, 正數的補碼等於原碼本身; 負數的補碼等於原碼數值位取反加 1。 原碼變補碼和補碼變原碼的方法是一樣的。