天天看點

《計算機組成原理》----2.4 有符号整數

本節書摘來自華章出版社《計算機組成原理》一書中的第2章,第2.4節, 作 者 computer organization and architecture: themes and variations[英]艾倫·克萊門茨(alan clements) 著,沈 立 王蘇峰 肖曉強 譯, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

盡管負數可以用很多種不同的方式表示,但計算機設計者選擇了3種方法:符号及值表示法,二進制補碼表示法,移碼表示法。每種方法都有其各自的優點和缺點。

一個n位字可以表示從0~2n-1共2n個可能的值。例如,用一個8位的字可以表示0,1,…,254,255。表示負數的一種方法是用它的最高位表示符号。通常符号位為0表示正數,符号位為1表示負數。

有符号數的值可被表示為(-1)s×m,這裡s為數的符号位的值,m為其數值部分。若s=0,則(-1)0=+1,該數為正數。如果s=1,則(-1)1=-1,該數為負數。例如,下面兩個8位有符号二進制數00001101和10001101的值為

《計算機組成原理》----2.4 有符号整數

n位有符号的表示範圍為-(2n-1-1)至+(2n-1-1)。一個8位有符号數可以表示-127(11111111)至+127(01111111)之間的整數。有人反對該系統的一個原因是它有兩個值都表示0:

00000000 = +0 以及 10000000 = -0

符号及值表示法并沒有被用于整數算術運算中,因為它的加、減法運算分别用加法器和減法器實作。很快我們就會看到另外一些隻需使用加法器的負數表示方法。符号及值表示法用于浮點算術運算中。

微處理器用二進制補碼系統表示有符号整數,因為它可以将減法運算轉換為對減數的補數的加法運算。用7加上5的補數就可以完成運算7減去5。

《計算機組成原理》----2.4 有符号整數

一個n位二進制數n的二進制補碼定義為2n-n。如果n = 5 = 00000101(8位二進制數),則n的補碼為28 - 00000101 = 100000000-00000101=11111011。注意,11111011也可以代表-00000101(-5)或+123,這取決于我們是将二進制數11111011看作補碼還是非符号整數。

下面的例子說明了8位二進制數的補碼運算過程。首先我們将4個數+5,-5,+7和-7轉換為補碼。

+5=00000101   –5=11111011   +7=00000111   –7=11111001

現在将7與5的互補數相加,

11111011 –5

100000010 2

結果為9位二進制數100000010。如果忽略最左邊一位(也叫“進位位”),結果為000000102= +2,這正是我們所希望看到的結果。下面來看看–7加5,

11111001 –7

11111110 –2

結果為11111110(進位位為0)。我們預期的結果為-2;即28-2=10000000-00000010 =

11111110。我們再一次得到了所需要的結果。

二進制補碼算術可不是魔術。請考慮n位二進制算術運算z=x-y,我們用x加上y的補數來完成這一運算。y的補碼為2n-y,則有z=x+(2n-y)=2n+(x+y)。

換句話說,我們得到了所需要的結果,x-y,以及位于最左邊的一個并不需要的進位(即2n),而這個進位被丢棄了。

對一個數兩次求補将得到這個數本身;例如,-5=28-00000101=11111011。再次求補,我們将得到:-(-5)=10000000-11111011=00000101=5。即-x=2n-x且-(-x)=2n-(2n-x)= x。請考慮下面的加法執行個體,它涵蓋了被加數與加數分别為正和為負時全部四種可能的情形。

《計算機組成原理》----2.4 有符号整數

将結果視為補碼時,所有4個例子都得到了我們所期望看到的結果。例3将6與9的補數相加完成運算-9+6,得到-3。-3的補碼為10000000 - 00000011 = 11111101。

例4計算-x + -y,得到-15,但這是一個模2n加法的結果。-15的補碼為10000000 - 00001111 = 11110001。當兩個數都是負數時,有(2n-x)+(2n-y)=2n+(2n-x-y)。這個表達式的第一部分是模2n加法時備援的2n,第二部分為-x-y的互補數。對于正數和負數加法的所有情形,補碼都可以得到正确的結果。

1.求補運算

如果不是因為求補運算非常簡單,補碼不會有這樣的吸引力。請考慮一個n位二進制補碼數n,它被定義為2n-n。将表達式2n-n變為下面的形式:

<code>2n-1-n+1=111...1-n+1</code>

例如,8位(n=8)時有

``28-n=100000000-n=100000000-1-n+1(調整後)

=11111111-n=1``

表達式11111111-n的值很容易計算。對于n的第i位,ni,若ni = 0,則1-0=1。同樣,若ni=1,則1-1=0。顯然1-ni=ni。可見計算n的補碼非常容易,所要做的就是将n的每一位取反并将結果加1。例如,對于下面的5位二進制數有