小節內容 |
一、r-1的補數 二、r的補數 三、補數減法 |
四、二進位有號數 五、2的補數運算 |
為了化簡減法與邏輯的運算,計算機中採用補數(complements)的概念。對於每一個基底為r的數目系統而言,可有兩種補數:(1)r的補數,(2)r-1的補數。例如,二進位系統有2的補數及1的補數,在十進位系統裡有10的補數及9的補數。
對於具有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來減。
對於具有n位數字,基底為r的數N,其r的補數定義為: 當N≠0時,為rn-N, 茲舉例如下:
將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。
若M,N為同基底r的n位數字無號數,則M-N可以下列步驟得之:
(r-1)的補數亦可用來做為無號數減法。(r-1)的補數比r的補數小1,則當被減數與減數的1的補數相加產生端進位時,此結果將比兩數之真正差少1。此時,可將此端進位加回其結果以產生真正的差,此稱為端迴進位(end-around carry)。若被減數與減數的1的補數相加無端進位時,此時結果將再求(r-1)之補數,再加負號即為答案。
此種端迴進位亦可用於十進位中之9的補數的無號數減法
在一般算術中可用正負號來表示正負數,但在計算機中卻須以0和1來表示,其方法多以一數的最左一位數字表示此數的正負,習慣上,以0表示正數,以1表負數。
上例後者的有號數表示法即為有號量(Signed-magnitude)表示法。在這種表示法裡,一個數字包含他的量與一個表示正負的位元,所以,01001表示+9;11001表示-9。一般的算術都是使用這種表示法。 有號量表示法 :10001001 在有號量中,可將+9中的符號位元改成1求得-9;在有號1的補數中,須將+9中包括符號位元在內的所有位元,都求其補數;在有號2的補數中,則是求包含符號位元的+9之2的補數。
1.正數的表示法:對三種表示法來說是完全一樣的。 有號量只適用於一般的算術運算,不適用於計算機上;因此,在計算機上都使用有號補數表示法。由於1的補數有兩個0(0000與1111),而且它在1變0,0變1的特性與邏輯上的補數完全一樣,遂都將1的補數運用在邏輯運算上,不使用為算術運算。只有早期計算機才會將它運用在算術運算上,目前絕大數計算機的算術運算均使用2的補數。
1.算術加法 為了得到正確的答案,必須確定和的位元數不超過他應有的位元數。如:兩個n位元的數目相加,若其和為n+1個位元則稱為溢位(overflow)。溢位會給計算機帶來難題,那就是無法在正常數字內表示發生溢位。
2.算術減法 (±A)-(+B)=(±A)+(-B) 在此,正數的2的補數即為負數;而負數的2的補數即為正數,但是仍然要注意溢位問題。例如: 答案為0000111(+7)顯然有溢位錯誤。 |