1. 程式人生 > >補碼詳細分析和匯編下的使用

補碼詳細分析和匯編下的使用

等號 反碼 記憶 進行 結果 line 絕對值 相加 -128

原碼,反碼,補碼

考慮範圍:二進制8位整數,[-128,127]

():二進制數中的所有的0變為1;所有的1變為0

這裏的01串默認為二進制

I.原碼

把數的絕對值寫成二進制的形式(7位),其中-128只取0000000

若數為非負數,則最高位(第八位)為0

若數為負數,則最高位(第八位)為為1

Ex:

72=2^6+2^3 01001000

-15=-(2^3+2^2+2^1+2^0) 10001111

II.原碼與反碼

正數:反碼=原碼

負數:在原碼的基礎上除最高位的數字“1”不變;其它位取反

反碼=(原碼-10000000)=11111111-(原碼-10000000)

則 原碼=11111111-反碼=(補碼)

III.原碼與補碼

正數:補碼=原碼

負數:在原碼的基礎上除最高位的數字“1”不變;其它位取反,再加1,如果有進位則忽略(原碼10000000,則補碼10000000)

除了10000000:

補碼=(原碼-10000000)+1

=11111111-(原碼-10000000)+1

=100000000-(原碼-10000000)

則 原碼-10000000=11111111-補碼+1=(補碼)+1

原碼-10000000=11111111-(補碼-1)=(補碼-1)

原碼-10000000=100000000-補碼

正數=原碼=補碼

負數=-(原碼-10000000)=補碼-100000000

即補碼=負數+100000000

10000000同樣滿足負數=補碼-100000000,補碼=負數+100000000

.

:

1.正數(00000000~01111111):補碼=正數=數%100000000

2.負數(-100000000~-00000001):

補碼=負數+100000000=數%100000000

所以:補碼=數%100000000

.

補碼:

1.00000000~01111111:數=補碼

2.10000000~11111111:數=補碼-100000000

由一、二得,數與補碼互相唯一決定對方

IV.補碼加法

要求:

1.不溢出:即結果在-128~127範圍內

2.第9位的進位忽略,即結果對100000000取余

x+y=z

補碼:x‘+y‘=z‘(補碼對應原碼,即x‘,y‘對應x,y)(這裏的等號不是傳統意義上的加法)

證明z‘與z互相唯一決定對方

證明:

z‘=(x‘+y‘)%100000000=(x%100000000+y%100000000)%100000000

=(x+y)%100000000=z%100000000

得證

V.補碼減法

要求:

1.不溢出:即結果在-128~127範圍內

2.若第8位不夠減,則第9位進行補位,即結果對100000000取余

x-y=z

補碼:x‘-y‘=z‘(補碼對應原碼,即x‘,y‘對應x,y)(這裏的等號不是傳統意義上的加法)

證明z‘與z互相唯一決定對方

證明:

z‘=(x‘-y‘)%100000000=(x%100000000-y%100000000)%100000000

=(x-y)%100000000=z%100000000

得證

以下是匯編部分——

VI.補碼加法的溢出判斷

要求:第9位的進位忽略,即結果對100000000取余

正數對應的補碼:00000000<=t<=01111111

負數對應的補碼:10000000<=t<=11111111

z‘=x‘+y‘ (x‘,y‘,z‘的原碼為x,y,z)

z‘對應z,兩者的溢出狀況相同,即兩者同時溢出或不溢出。

1.x’最高位為0,y’最高位為1(x=非負,y=負)

原碼:

x+y>=0+(-128)=128

x+y<=127+(-1)=126<=127

原碼沒有溢出,對應補碼也不會溢出

2. x’最高位為0,y’最高位為0(x=非負,y=非負)

00000000<=x‘,y‘<=01111111,兩者相加小於100000000,不會進位,z‘=x‘+y‘。

非負數+非負數,結果為非負數,非負數最大時對應的補碼為01111111。

x‘+y‘大於等於10000000(80H),溢出;

x‘+y‘小於10000000(80H),不溢出。

3. x’最高位為1,y’最高位為1(x=負,y=負)

10000000<=x‘,y‘<=11111111,兩者相加大於等於10000000,會進位,z‘=x‘+y‘-100000000。

負數+負數,結果為負數,負數最大時對應的補碼為10000000。

x‘+y‘-100000000小於10000000(80H),溢出;

x‘+y‘-100000000大於等於10000000(80H),不溢出。

VII.補碼減法的溢出判斷

要求:第9位的借位忽略,即結果對100000000取余

正數對應的補碼:00000000<=t<=01111111

負數對應的補碼:10000000<=t<=11111111

z‘=x‘-y‘ (x‘,y‘,z‘的原碼為x,y,z)

z‘對應z,兩者的溢出狀況相同,即兩者同時溢出或不溢出。

1.x’最高位為0,y’最高位為0(x=非負,y=非負)

原碼:

x-y>=0-127=-127>=-128

x-y<=127-0=127

原碼沒有溢出,對應補碼也不會溢出

2.x’最高位為1,y’最高位為1(x=負,y=負)

原碼:

x-y>=(-128)-(-1)=-127>=-128

x-y<=(-1)-(-128)=127

原碼沒有溢出,對應補碼也不會溢出

3. x’最高位為0,y’最高位為1(x=非負,y=負)

00000000<=x‘<=01111111,10000000<=y‘<=11111111,兩者相減小於0,會借位,z‘=x‘-y‘+100000000。

非負數-負數,結果為非負數,非負數最大時對應的補碼為01111111。

x‘-y‘+100000000大於等於10000000(80H),溢出;

x‘-y‘+100000000小於10000000(80H),不溢出。

4. x’最高位為1,y’最高位為0(x=負,y=非負)

10000000<=y‘<=11111111,00000000<=y‘<=01111111,兩者相減大於0,不會借位,z‘=x‘-y‘。

負數-非負數,結果為負數,負數最大時對應的補碼為10000000。

x‘-y‘小於10000000(80H),溢出;

x‘-y‘大於等於10000000(80H),不溢出

總結:補碼的結果必然為負數和非負數的其中一類。當運算溢出,數超出了負數/非負數的範圍[即若結果為負數,補碼小於80H;若結果為非負數,補碼大於等於80H],到達非負數/負數,即邏輯上真正的結果與實際結果相反。

sf:實際上是進行補碼運算,即z‘=(x+/-y)%100000000,當z‘的最高位為1,即負,sf=1;當z‘的最高位為0,即非負,sf=0。(這樣記憶就好了!)

cf:在無符號數運算中有進位或借位,cf=1;否則cf=0

of:進行有符號數運算,若溢出(超出[-128,127]),of=1;否則of=0

cmp x,y

對於x-y的結果:

I.當sf=1,of=0:沒溢出,即結果為負數(sf),x<y。

II.當sf=1,of=1:溢出,即結果為非負數(非sf)。即為非負數-負數,所以不存在相等的情況。x>y。

III.當sf=0,of=0:沒溢出,即結果為非負數(sf)。等號可以成立,當x=y時成立。x>=y。

IV.當sf=0,of=1:溢出,即結果為負數(非sf),x<y。

補碼詳細分析和匯編下的使用