天天看點

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

目錄

一、移位運算

1、移位的意義

2、算術移位規則

3.算術移位和邏輯移位的差別

二、加法與減法運算

1.補碼加減運算的基本公式

2.溢出判斷

(1)一位符号位判斷溢出

(2)符号位和數值部分的最高位判溢出

(3)采用雙符号位補碼進行判斷

補碼的設計目的:

  1. 使符号位能與有效值部分一起參加運算,進而簡化運算規則
  2. 使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計

所有這些轉換都是在計算機的最底層進行的,而在我們使用的彙編、C等其他進階語言中使用的都是原碼。

定點數運算包括移位、加、減、乘、除幾種。

一、移位運算

1、移位的意義

移位運算在日常生活中常見。例如:

  • 15米可寫作1500厘米,單就數字而言,1500相當于小數點左移了兩位,并在小數點前面添了兩個0;
  • 同樣15也相當于1500相對于小數點右移了兩位,并删去了小數點後面的兩個0。
  • 可見,當某個十進制數相對于小數點左移n位時,相當于該數乘以10^n;右移n位時,相當于該數除以10^n。
計算機中小數點的位置是事先約定的,是以,二進制表示的機器數在相對于小數點作n位左移或右移時,其實質就便該數乘以或除以2^n(n=1,2...n)。

移位運算又叫移位操作,對計算機來說,有很大的實用價值,例如,當計算機沒有乘(除)運算線路時,可以采用移位和加法相結合,實作乘(除)運算。

  • 在計算機中,移位與加減配合,能夠實作乘除運算

計算機中機器數的字長往往是固定的,當機器數左移n位或右移n位時,必然會使其n位低位或n位高位出現空位。那麼,對空出的空位應該添補0還是1呢?

這與機器數采用有符号數還是無符号數有關,對有符号的移位叫算術移位。

2、算術移位規則

對于正數,由于 [x]原=[x]補=[x]反=真值 ,故移位後出現的空位均以0添之。

對于負數,由于原碼、補碼和反碼的表示形式不同,故當機器數移位時,對其空位的添補規則也不同。

下表列出了三種不同碼制的機器數(整數或小數均可),分别對應正數或負數,移位後的添補規則。

必須注意的是:不論是正數還是負數,移位後其符号位均不變,這是算術移位的重要特點。

不同碼制機器數移位後的空位添補規則

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

由上表可得出如下結論:

  1. 機器數為正數時,不論左移或右移,添補代碼均為0。
  2. 由于負數的原碼其數值部分與真值相同,故在移位時隻要使符号位不變,其空位均添0。
  3. 由于負數的反碼其各位除符号位外與負數的原碼正好相反,故移位後所添的代碼應與原碼相反,即全部添1。
  4. 分析任意負數的補碼可發現,當對其由低位向高位找到第一個“1”時,在此“1”左邊的各位均與對應的反碼相同,而在此“1”右邊的各位(包括此“1”在内)均與對應的原碼相同,即添0;

如1.1111100000的不同碼制的值的比較:

  • [x]原=1.1111100000
  • [x]反=1.0000011111
  • [x]補=1.0000100000    ——>"1"  右邊的各位0與對應的原碼相同,代表真值的0  ;"1"左邊的各位0與對應的反碼相同,代表真值的1

例:

  • 設機器數字長為8位(含一位符号位),若A=±26,寫出三種機器數左、右移一位和兩位後的表示形式及對應的真值,并分析結果的正确性。

解:

(1)當A = +26 = +11010(二進制碼),機器數字長為8位,則 [A]原=[A]補=[A]反=0,0011010

移位結果表示如下:

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

可見,對于正數,三種機器數移位後符号位不變,左移時最高數位丢1,結果出錯;右移時最低數位丢1,影響精度。

(2)當 A = -26 = -11010(二進制碼),三種機器數移位結果示于下表

原碼

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

補碼

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

反碼

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

可見,對于負數,三種機器數移位後符号位均不變。

  • 負數的原碼左移時,高位丢1,結果出錯;低位丢1,影響精度。
  • 負數的補碼左移時,高位丢0,結果出錯;低位丢1,影響精度。
  • 負數的反碼左移時,高位丢0,結果出錯;低位丢0,影響精度。

下圖示意了機器中實作算術左移和右移操作的硬體框圖

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

3.算術移位和邏輯移位的差別

有符号數的移位稱為算術移位,無符号數的移位稱為邏輯移位。

邏輯移位的規則是:

  • 邏輯左移時,高位移出,低位添0;
  • 邏輯右移時,低位移出,高位添0。

例如

  • 寄存器内容為01010011,邏輯左移為1010010,算術左移為00100110(最高數位“1”移丢)。
  • 又如寄存器内容為10110010,邏輯右移為01011001。若将其視為補碼,算術右移為11011001。

顯然,兩種移位的結果是不同的。

上例中為了避免算術左移時最高數位丢1,可采用帶進位(Cy)的移位,其示意圖如下圖所示。算術左移時,符号位移至Cy,最高數位就可避免移出。

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

二、加法與減法運算

減法運算是計算機中最基本的運算,因減法運算可看作被減數加上一個減數的負值,即A-B=A+(-B),故在此将機器中的減法運算和加法運算合在一起讨論。

現代計算機中都采用補碼作加減法運算。

1.補碼加減運算的基本公式

補碼加法的基本公式為:

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

即補碼表示兩個數在進行加法運算時,可以把符号位與數位同等處理,隻要結果不超出機器能表示的數值範圍,運算後的結果按2^(n+1)取模(對于整數);或按2取模(對于小數),就能得到本次加法的運算結果。

對于減法,因 A-B=A+(-B),則 [A-B]補=[A+(-B)]補

由補碼加法基本公式可得:

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

是以,若機器數采用補碼, 當求A-B時, 隻需先求[-B]補(稱[-B]補為“求補”後的減數),就可按補碼加法規則進行運算。而[-B]補由[B]補連同符号位在内,每位取反,末位加1而得。

例:A=0.1010,B=-0.0101,用補碼的加法求A+B

[A]補=0.1011,[B]補=1.1011

計算機組成原理13-定點數的移位、加法與減法運算一、移位運算二、加法與減法運算

 

[A]補+[B]補 = 0.1011+1.1011=0.0110(按模2的意義,最左邊的1丢掉),是以 A+B=0.0110

例:x=0.1001,y=-0.0011,用補碼的減法求x-y

解:[x]補=0.1001,[y]補=1.1101,[-y]補=0.0011

  [x]補-[y]補=[x]補+[-y]補=0.1001+0.0011=0.1100,是以 x-y=0.1100

例:設機器數字長為8位,其中一位為符号位,令A=-93,B=+45,求[A-B]補。

解:由A=-93=-1011101,得[A]補=1,0100011,由B=+45=+0101101,得[B]補=0,0101101,[-B]補=1,1010011

  [A-B]補=[A]補+[-B]補=1,0100011+1,1010011=10,1110110

按模2^(n+1)的意義,最左邊的“1”自然丢掉,故[A-B]補=0,1110110,還原成真值得A-B=118,結果出錯,這是因為A-B=-138超出了機器字長所能表示的範圍。在計算機中,這種超出機器字長的現象,叫溢出。為此,在補碼定點加減運算過程中,必須對結果是否溢出作出明确的判斷。

2.溢出判斷

補碼定點加減運算判斷溢出有三種方法。

(1)一位符号位判斷溢出

對于加法,隻有在正數加正數和負數加負數兩種情況下才可能出現溢出,符号不同的兩個數相加是不會出現溢出的。

對于減法,隻有在正數減負數或負數減正數兩種情況下才可能出現溢出,符号相同的兩個數相減是不會出現溢出的。

是以在判斷溢出時可以根據參加運算的兩個資料和結果的符号位進行。

兩個符号位相同的補碼相加,如果和的符号位與加數的符号相反,則表明運算結果溢出;

兩個符号位相反的補碼相減,如果差的符号位與被減數的符号位相反,則表明運算結果溢出。

這種方法需要判斷操作是加法還是減法,以及運算結果與操作數的符号關系。

(2)符号位和數值部分的最高位判溢出

利用資料編碼的最高位(符号位)和次高位(數值部分的最高位)的進位狀況來判斷運算結果是否發生了溢出。

兩個補碼數實作加減運算時,若最高數值位向符号位的進位值與符号位産生的進位輸出值不相同,則表明加減運算産生了溢出。

因為當x和y均為n+1位正整數時,其和有兩種情況:

  1. 當x+y<2^n時,不會發生溢出;
  2. 當x+y≥2^n時符号位沒有進位,表明發生溢出。

當x和y都是n+1位負數時,其和也有兩種情況:

  1. 當x+y≥-2^n時,不會發生溢出;
  2. 當x+y<-2^n時,符号位相加後變成0并且有進位,而數值部分的最高位相加時無進位,結果變為正數,表明發生了溢出。

減法的情況與此類似,這種判斷方法的邏輯表達式如下:

例:設x=+1011, y=+1001,求[x+y]補。

解:[x]補=01011, [y]補=01001

  [x+y]補=01011+01001=10100

  兩個正數相加,最高兩位的進位為01,表示發生了溢出,其結果為負數,顯然是錯誤的。

例:設x=-1101,y=-1011,求[x+y]補。

解:[x]補=10011, [y]補=10101

  [x+y]補=10011+10101=01000

  兩個負數相加,最高兩位的進位為10,表示發生了溢出,其結果為正數,顯然是錯誤的。

(3)采用雙符号位補碼進行判斷

正常時兩個符号位的值相同,在運算結果中當兩個符号位不同時則表明發生了溢出。

運算結果的符号位為01表明兩個正數相加,結果大于機器所能表示的最大正數,稱為上溢;

運算結果的符号位為10表明兩個負數相加,結果小于機器所能表示的最小負數,稱為下溢。

也就是說,兩個正數相加,數值位不應向符号位同時産生進位,使得結果數的符号位和操作數的一樣,為00:

  • 00+00+00(進位) = 00 (mod 4)

兩個負數相加,數值位應向符号位産生進位,使得兩個負數的雙符号位的運算為11:

  • 11+11+01(進位)=11(mod 4)

當運算結果的兩個符号位不相同時,表明出現了溢出。

例:設x=+1100,y=+1000,求6位雙符号位補碼之和[x+y]補。

解:[x]補=001100, [y]補=001000

  [x+y]補=001100+001000=010100

  [x+y]補=010100,其中兩個符号位出現01,表示已溢出。

例:設x=-1100,y=-1000,求6位雙符号位補碼之和[x+y]補。

解:[x]補=110100, [y]補=111000

  [x+y]補=110100+111000=101100

  [x+y]補=101100,其中兩個符号位出現10,表示已溢出。

從上述例子中還看出,不論溢出與否,最高位始終訓示正确的符号。

采用雙符号位補碼後,任何小于1的正數,兩個符号位都是0;任何大于-1的負數,兩個符号位都是1。

如果兩個數相加後,其結果的符号位出現01或10時,表示發生溢出。因為兩個絕對值小于1的數相加,其結果不會大于或等于2,是以最高位總是表示正确的符号。這也可以表示為:

當最高資料位有進位而符号位無進位時産生上溢出;當最高資料位無進位而符号位有進位時,表示下溢出。

在雙符号位補碼中,正常的資料中兩個符号位總是相同的,是以在存儲資料時不必重複存儲,隻是在将資料送往運算部件進行運算時才把符号位進行複制形成雙符号位補碼。

繼續閱讀