最近看了一些電腦書,介紹電腦如何處理正負數字。一口氣看了兩遍,也不是很明白。畢竟筆者上一次學習數字已經是多年前的事,一時間忘記了進制轉換等知識。最後再看多一次,記憶也就慢慢的回來了。
在開始之前,先認識不同的單位。 最少的資訊單位是 bit
,以 0
和 1
表示。而 RAM 最少的單位是 byte
,1 byte
等於 8 bits
。而 1 word
等於 2 bytes
。電腦有 3 種數字的表達形式,分別是原數(原碼)、反數(反碼)和補數(補碼)。
在以下例子中,我們以 8 位元
的 +18 和 -18 作例子。
原數(原碼)
電腦會使用 8 位元
中最左的一個位元作記號。0
代表正數,1
代表負數。
+18
在 8位元
二進制的原碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+
-18
在 8位元
二進制的原碼是︰
+-+-+-+-+-+-+-+-+
|1|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+
問題是︰0
的表達形式是什麼?
+0
在 8位元
二進制的原碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
-0
在 8位元
二進制的原碼是︰
+-+-+-+-+-+-+-+-+
|1|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
由於 0
是不分正和負的,所以以原碼來表達數字是有問題的。最完美的方案是每個數字也有獨立的表達形式。
反數(反碼)
電腦會使用 8位元
中最左的一個位元作記號。0
代表正數,1
代表負數。正數的反碼是跟原碼一樣。而負數的反碼是除第一個位外,將 0
和 1
反轉。
+18
在 8位元
二進制的反碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+
-18
在 8位元
二進制的反碼是︰
+-+-+-+-+-+-+-+-+
|1|1|1|0|1|1|0|1|
+-+-+-+-+-+-+-+-+
問題是︰0
的表達形式是什麼?
+0
在 8位元
二進制的反碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
-0
在 8位元
二進制的反碼是︰
+-+-+-+-+-+-+-+-+
|1|1|1|1|1|1|1|1|
+-+-+-+-+-+-+-+-+
0
這個數字也有兩種表達形式。所以反碼也是有問題的。
為了解決「唯一」的這個問題,補碼就出現了。補碼是一種能讓電腦不用理會數字是正數還是負數的表達形式。
補數(補碼)
正數的補碼是跟原碼一樣。而負數的補碼是反碼加上 1
。
+18
在 8位元
二進制的補碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+
-18
在 8位元
二進制的補碼是︰
+-+-+-+-+-+-+-+-+
|1|1|1|0|1|1|1|0|
+-+-+-+-+-+-+-+-+
問題是︰0
的表達形式是什麼?
+0
在 8位元
二進制的補碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
-0
在 8位元
二進制的補碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
為什麼會這麼神奇的?讓我們一步步的看看。
-0
在 8位元
二進制的原碼是︰
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
-0
在 8位元
二進制的反碼是(首數字為1代表負數,其他數字為 0
,反數將之轉為 1
)︰
+-+-+-+-+-+-+-+-+
|1|1|1|1|1|1|1|1|
+-+-+-+-+-+-+-+-+
將反碼 +1
,由於超出了 8位元
,所以結果如下︰
+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+
由此可見,補碼是完美的表達形式,每個數字都有唯一表示碼。