
最近看了一些電腦書,介紹電腦如何處理正負數字。一口氣看了兩遍,也不是很明白。畢竟筆者上一次學習數字已經是多年前的事,一時間忘記了進制轉換等知識。最後再看多一次,記憶也就慢慢的回來了。
在開始之前,先認識不同的單位。 最少的資訊單位是 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|
+-+-+-+-+-+-+-+-+
由此可見,補碼是完美的表達形式,每個數字都有唯一表示碼。