Signed Number Representations
目錄

最近看了一些電腦書,介紹電腦如何處理正負數字。一口氣看了兩遍,也不是很明白。畢竟筆者上一次學習數字已經是多年前的事,一時間忘記了進制轉換等知識。最後再看多一次,記憶也就慢慢的回來了。

在開始之前,先認識不同的單位。 最少的資訊單位是 bit,以 01 表示。而 RAM 最少的單位是 byte1 byte 等於 8 bits 。而 1 word 等於 2 bytes 。電腦有 3 種數字的表達形式,分別是原數(原碼)、反數(反碼)和補數(補碼)。

在以下例子中,我們以 8 位元 的 +18 和 -18 作例子。

原數(原碼)

電腦會使用 8 位元 中最左的一個位元作記號。0 代表正數,1 代表負數。

+188位元 二進制的原碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+

-188位元 二進制的原碼是︰

+-+-+-+-+-+-+-+-+
|1|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+

問題是︰0 的表達形式是什麼?

+08位元 二進制的原碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

-08位元 二進制的原碼是︰

+-+-+-+-+-+-+-+-+
|1|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

由於 0 是不分正和負的,所以以原碼來表達數字是有問題的。最完美的方案是每個數字也有獨立的表達形式。

反數(反碼)

電腦會使用 8位元 中最左的一個位元作記號。0 代表正數,1 代表負數。正數的反碼是跟原碼一樣。而負數的反碼是除第一個位外,將 01 反轉。

+188位元 二進制的反碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+

-188位元 二進制的反碼是︰

+-+-+-+-+-+-+-+-+
|1|1|1|0|1|1|0|1|
+-+-+-+-+-+-+-+-+

問題是︰0 的表達形式是什麼?

+08位元 二進制的反碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

-08位元 二進制的反碼是︰

+-+-+-+-+-+-+-+-+
|1|1|1|1|1|1|1|1|
+-+-+-+-+-+-+-+-+

0 這個數字也有兩種表達形式。所以反碼也是有問題的。

為了解決「唯一」的這個問題,補碼就出現了。補碼是一種能讓電腦不用理會數字是正數還是負數的表達形式。

補數(補碼)

正數的補碼是跟原碼一樣。而負數的補碼是反碼加上 1

+188位元 二進制的補碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|
+-+-+-+-+-+-+-+-+

-188位元 二進制的補碼是︰

+-+-+-+-+-+-+-+-+
|1|1|1|0|1|1|1|0|
+-+-+-+-+-+-+-+-+

問題是︰0 的表達形式是什麼?

+08位元 二進制的補碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

-08位元 二進制的補碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

為什麼會這麼神奇的?讓我們一步步的看看。

-08位元 二進制的原碼是︰

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

-08位元 二進制的反碼是(首數字為1代表負數,其他數字為 0,反數將之轉為 1)︰

+-+-+-+-+-+-+-+-+
|1|1|1|1|1|1|1|1|
+-+-+-+-+-+-+-+-+

將反碼 +1,由於超出了 8位元,所以結果如下︰

+-+-+-+-+-+-+-+-+
|0|0|0|0|0|0|0|0|
+-+-+-+-+-+-+-+-+

由此可見,補碼是完美的表達形式,每個數字都有唯一表示碼。