補碼詳細分析和匯編下的使用
原碼,反碼,補碼
考慮範圍:二進制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。
補碼詳細分析和匯編下的使用