Signed Number Representations

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

在開始之前,先認識不同的單位。 最少的資訊單位是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|
+-+-+-+-+-+-+-+-+

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