1. 程式人生 > >二進位制數、位和位元組

二進位制數、位和位元組

書寫數字的常用方法是十進位制。例如:2157的千位是2,百位是1,十位是5,個位是7,這意味著可以將2157看作如下形式:

2×1000+ 1×100 + 5×10 + 7×1

也就是如下形式:

2×103+1×102+ 5×101+7×100

姑且認為,十進位制得以發展的原因是我們都有10根手指。在某種意義上說,計算機的位只有2根手指,原因是它只能被設為0或1。因此,以2為基數的系統適用於計算機。它用2的冪代替10的冪。以2為基數表示的數字稱為二進位制數。數字2對於二進位制數的作用和數字10對於十進位制數的作用是相同的。例如,二進位制數1101可表示為一下形式:

1×23+ 1×22 + 0×21

+ 1×20

以十進位制數形式表示為:

1×8+ 1×4 + 0×2 + 1×1 = 13

可以使用二進位制系統將任何整數表示為1和0的組合。這種系統非常適於數字計算機使用,數字計算機使用開啟和關閉狀態的組合來表示資訊,而這些狀態可以使用1和0表示。

二進位制整數

一個位元組通常包括8個位。我們可以將這8位從左到右看作是從7到0。在位元組中,位7稱為高位,為0稱為低位。每位數字是對應2的一個特定的指數。可將位元組設想成如下圖的形式

這裡128是2的7次冪,依此類推。該位元組可以儲存的最大數是把所有的位都設定為1:11111111。該二進位制數的值如下:

128 + 64 +32 + 16 + 8 + 4 + 2 + 1 = 255

最小的二進位制數是 00000000,或一個簡單的0。一個位元組可以儲存的範圍是0到255,總共256個可能的值。通過改變對位模式的解釋方式,一個位元組可以儲存從-128到+127之間的整數,總共還是256個值。

有符號整數

有符號數的表示方法是由硬體決定,而不是C決定的。或許表示有符號數最簡單的方法就是保留1位符號位。在一個1位元組值中,該方法為數字本身留下7位。使用這樣的符號量表示法,10000001表示-1,00000001表示1。那麼整個範圍是-127到+127。這就是原碼,原碼是人腦最容易理解和記憶的方式。 這種方法的一個缺點是有兩個零:+0和-0。二進位制補碼避免了這種問題,這是當今使用最普遍的系統。不過在介紹補碼之前,需要先介紹二進位制反碼。
反碼的表示方法是:正數的反碼是其原碼本身,負數的反碼是在其原碼基礎上,符號位不變,其餘各位取反。因此,00000001(+1)的反碼為:00000001,10000001(-1)的反碼為:11111110。在此基礎之上,正數的補碼仍然為其原碼本身,負數的補碼再在其反碼基礎上加1。因此,10000001(-1)的補碼即為:11111111。 補碼如何解決兩個零的問題呢?以十進位制數1 - 1 = 0為例,如果用原碼錶示,讓符號位也參與計算,如下:

1 – 1 = 1 +(-1) = 00000001 + 10000001 = 10000010 = -2

這個結果顯然是不正確的。為了解決這個問題,我們引入了反碼:

1 – 1 = 1 +(-1) = 00000001 + 10000001 = 00000001 + 11111110 = 11111111 = 10000000 = -0

發現結果的真值部分是正確的,而符合位存在問題,雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有意義的。因此,補碼的出現就是解決這個問題:

1 – 1 = 1 +(-1) = 00000001 + 10000001 = 00000001 + 11111111 = 100000000

結果為9位,去掉最高位,結果為00000000 = 0。這樣0用00000000表示,可以用10000000表示-128。

補碼再深入

由於任何單位元組數的補碼和它相反數的補碼相加,結果都為100000000。因此,從這個9位組合100000000(256的二進位制形式)中減去一個負數的位組合,結果一定是該負數值的數量。例如一個負數的位組合為10000000。作為一個無符號數,該組合為128。作為一個有符號數,該組合為負,並且值為100000000 - 10000000,即10000000(128)。因此,該數為-128。與之類似,10000001是-127,11111111是-1。 要對一個二進位制補碼數取相反數,最簡單的方法是反轉每一位,然後加1。因為1是00000001,所以-1是11111110 + 1,即11111111,和前面所看到的是一致的。

二進位制浮點數

浮點數分兩部分儲存:一個二進位制小數和一個二進位制指數。普通的小數0.527代表:

5 ÷10+ 2 ÷100 + 7÷1000

其中的分母是10的依次遞增的冪。在二進位制小數中,使用2的冪作為分母,因此二進位制小數 .101 代表:

1÷2+ 0÷4 + 1÷8 = 0.50 + 0.00 +0.125 = 0.625

像1/3這樣的許多小數不能用十進位制計演算法精確地表示。同樣,許多小數也不能用二進位制計數法精確地表示。實際上,二進位制計數法只能精確地表示多個1/2的冪的和。因此3/4和7/8可以精確表示為二進位制小數,但是1/3和2/5卻不能。

要在計算機中表示一個浮點數,需要留出若干位(其位數取決於系統)存放一個二進位制小數,其他位存放一個指數。總之,數字的實際值是二進位制小數部分乘以2的指定次冪。比如用4乘以一個浮點數,則指數增加了2,二進位制小數不改變。用一個不是2的冪的數乘以一個浮點數,則會改變二進位制小數,如果有必要也會改變指數部分。

本文參考了C Primer Plus, Fifth Editon Chapter 15. Bit Fiddling