第六節:補數及其加減運算

小節內容

一、r-1的補數
二、r的補數
三、補數減法
四、二進位有號數
五、2的補數運算

  為了化簡減法與邏輯的運算,計算機中採用補數(complements)的概念。對於每一個基底為r的數目系統而言,可有兩種補數:(1)r的補數,(2)r-1的補數。例如,二進位系統有2的補數及1的補數,在十進位系統裡有10的補數及9的補數。

一、r-1的補數

  對於具有n位數字,基底為r的數N,則他的r-1的補數為

                                (rn-1)-N

  以十進位為例,r=10,而r-1=9,所以,N的9的補數便為(10n-1)-N。由於10n-1是個有n個9的數字,如n=4,104=1000,104-1=9999,因此,若將每位數字都以9來減便可得9的補數。例如:

  546700的9的補數為999999-546700=453299

  12389的9的補數為99999-12389=87610

  在二進位中基底r=2而r-1=1,所以,得1的補數為(2n-1)-N;其中2n為二進位表示法,其值為一個1之後連著n個0,而2n-1為n個1的二進位數。若n=4,則24=(10000)2而2n-1=(1111)2。於是二進位的1的補數便是將每一數字都以1來減。當在求1的補數時有1-0=1及1-1=0兩種情況,1的補數的求法遂可簡化成直接將所有的1代換成0,所有的0轉換成1,如下所示:

  1011001的1的補數為0100110

  0001111的1的補數為1110000

  八進位和十六進位的(r-1)的補數則是分別以7和F來減。

二、r的補數 Top

  對於具有n位數字,基底為r的數N,其r的補數定義為:

  當N≠0時,為rn-N,
  當N=0時,為0。

  茲舉例如下:

1.(52520)10 的10的補數為105-52520=47480,因整數位數為5,故n=5。
2.(0.3267)10 的10的補數為100-0.3267=0.6733,因無整數部份,故n=0。
3.(25.639)10 的10的補數為102-25.639=74.361,因整數位數為2,故n=2。
4.(101100)2 的2的補數為:(26)2-(101100)2=(1000000)2-(101100)2=(010100)2
5.(0.0110)2 的2的補數為1-0.0110=0.1010。

  將r的補數與(r-1)的補數做比較,將可發現(r-1)的補數加1便可得到r的補數,此乃因為rn-N=[(rn-1)-N]+1。所以,十進位2389的10的補數可由其9的補數加1而得。7610+1=7611;二進位101100的2的補數亦可由其1的補數加1而得010011+1=010100。

三、補數減法 Top

  若M,N為同基底r的n位數字無號數,則M-N可以下列步驟得之:
(1)將被減數M與減數N的r的補數相加。
(2)若M≧N則上式的和必有端進位(end carry)rn,此進位可忽略,所餘的便是M-N的結果。
(3)若M<N則上式的和沒有產生端進位,只需將(1)結果再求補數並加上負號便可得到答案。
以下舉例說明上述步驟。

【例 2-6】用10的補數求72532-3250
解:
忽略上述和的端進位即為M-N的答案,即72532-03250=69282

【例 2-7】用10的補數求3250-72532
解:
所以,再求30718之10的補數為69282並加上負號即答案為-69282

【例 2-8】用2的補數法求M-N
解:
因無端進位,故得解為-10000=-(1110000的2之補數)

  (r-1)的補數亦可用來做為無號數減法。(r-1)的補數比r的補數小1,則當被減數與減數的1的補數相加產生端進位時,此結果將比兩數之真正差少1。此時,可將此端進位加回其結果以產生真正的差,此稱為端迴進位(end-around carry)。若被減數與減數的1的補數相加無端進位時,此時結果將再求(r-1)之補數,再加負號即為答案。

【例 2-9】以1的補數求例2-8(M-N)
解:
因無端進位,故得解為-(1101111的1之補數)=-10000

          此種端迴進位亦可用於十進位中之9的補數的無號數減法

四、二進位有號數 Top

  在一般算術中可用正負號來表示正負數,但在計算機中卻須以0和1來表示,其方法多以一數的最左一位數字表示此數的正負,習慣上,以0表示正數,以1表負數。
  無號數和有號數的不同,我們可以從下面的例子看出來。

【例 2-10】
解: 01001在二進位無號數中視為9,但在有號數中視為+9;
11001在二進位無號數中視為25,但在有號數中視為-9。

  上例後者的有號數表示法即為有號量(Signed-magnitude)表示法。在這種表示法裡,一個數字包含他的量與一個表示正負的位元,所以,01001表示+9;11001表示-9。一般的算術都是使用這種表示法。
  在計算機中的算術運算則是有號補數來表示正負數,有1的補數與2的補數兩種,而2的補數最常使用。例如,以8位元來表示9,則+9的表示法為:00001001,只有一種表示法,但他的負數-9卻可有三種不同的表示法:

  有號量表示法 :10001001
  有號1的補數法 :11110110
  有號2的補數法 :11110111

  在有號量中,可將+9中的符號位元改成1求得-9;在有號1的補數中,須將+9中包括符號位元在內的所有位元,都求其補數;在有號2的補數中,則是求包含符號位元的+9之2的補數。
  表2-7所列為四位元二進位有號數的三種不同表示法,他們的十進位等價數也列在左邊以供對照。
  觀察表2-7我們可以得到底下幾點結論:

表 2-7 二進位有號數表示法

  1.正數的表示法:對三種表示法來說是完全一樣的。
  2.0的表示:有號2的補數表示法只有一種0;其它兩種表示法有正0與負0兩種。
  3.無論是何種表示法,負數的最左位元一定為1,這是與正數的不同點。
  4.n個位元可表示個2n數字,所以4個位元,可表示16個數字。
    但不同的表示法,其表示的範圍各有不同。
  有號量表示法 :-(2n-1-1)~+(2n-1-1)
  有號1的補數法 :-(2n-1-1)~+(2n-1-1)
  有號2的補數法 :-(2n-1)~+(2n-1)

  有號量只適用於一般的算術運算,不適用於計算機上;因此,在計算機上都使用有號補數表示法。由於1的補數有兩個0(0000與1111),而且它在1變0,0變1的特性與邏輯上的補數完全一樣,遂都將1的補數運用在邏輯運算上,不使用為算術運算。只有早期計算機才會將它運用在算術運算上,目前絕大數計算機的算術運算均使用2的補數。

五、2的補數運算 Top

1.算術加法
  二有號量的數之加法遵循一般的算術加法原則:二數同號時,將二數的量直接相加;不同號時,以量大者減掉量小者,符號則取其量大者同號。舉例來說,(+25)+(-37)=-(37-25)=-12即是以37減掉25,再取與37同號。這種做法須比較它們的符號和量的大小以決定使用加法或減法。反之,有號補數的加法不需要做符號比較或任何減法,只須作加法便可。其步驟可以下列數句簡單說明:
  兩有號二進位的加法若以有號2的補數為其負數表示法時,則此二數的加法為將此二數相加(包括符號位元),且符號位元相加的進位忽略不計。
        例如:

  為了得到正確的答案,必須確定和的位元數不超過他應有的位元數。如:兩個n位元的數目相加,若其和為n+1個位元則稱為溢位(overflow)。溢位會給計算機帶來難題,那就是無法在正常數字內表示發生溢位。

【例 2-11】求出下列各數相加的結果
(a)01000+01000        (b)10111+11000
解:

2.算術減法
  當以2的補數表示負數而做二數減法時,其做法可簡述如下:
  將被減數與減數之2的補數相加,不計符號位元相加的進位。
  此一作法乃是因為若將減數的符號變號,則可將減法改為加法。即

  (±A)-(+B)=(±A)+(-B)
  (±A)-(-B)=(±A)+(+B)

  在此,正數的2的補數即為負數;而負數的2的補數即為正數,但是仍然要注意溢位問題。例如:

  答案為0000111(+7)顯然有溢位錯誤。
  值得注意的是有號補數的加減法與無號數加減法的規則完全一樣;因此,計算機只需要一種共同硬體線路便可做此二種不同型態的算術運算。


Top