您可以編寫一個簡單的程序來檢查邏輯對3位加/減的操作。
#include <stdio.h>
int main (void)
{
unsigned int ra;
unsigned int rb;
unsigned int rc;
unsigned int rd;
unsigned int re;
unsigned int cy;
unsigned int ov;
unsigned int ovx;
unsigned int ovy;
int sa;
int sb;
int sc;
int sd;
for(ra=0;ra<8;ra++)
{
for(rb=0;rb<8;rb++)
{
printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
printf(" + ");
printf("%u%u%u",(rb>>2)&1,(rb>>1)&1,(rb>>0)&1);
printf(" :");
if(ra&4) sa=(ra|((-1)<<3)); else sa=ra;
if(rb&4) sb=(rb|((-1)<<3)); else sb=rb;
sc = sa + sb;
//printf("%u(%2d) + %u(%2d)",ra,sa,rb,sb);
printf("%2d + %2d = %2d",sa,sb,sc);
printf(" :");
rc=rb;
printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
printf(" + ");
printf("%u%u%u",(rc>>2)&1,(rc>>1)&1,(rc>>0)&1);
printf(" + 0 = ");
rd=ra+rc+0;
if(rd&4) sd=(rd|((-1)<<3)); else sd=rd;
re=(ra&3)+(rc&3)+0;
ov=0;
if((ra&4)==(rc&4)) ov = ((rd>>3)&1)^((rd>>2)&1);
ovy=0;
if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
ovx = ((rd>>3)&1)^((re>>2)&1);
printf("%u%u%u",(rd>>2)&1,(rd>>1)&1,(rd>>0)&1);
printf(" C %u O %u %u %u ",(rd>>3)&1,ov,ovx,ovy);
if(sc>3) printf("X");
if(sc<(-4)) printf("X");
printf("\n");
}
}
for(ra=0;ra<8;ra++)
{
for(rb=0;rb<8;rb++)
{
printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
printf(" - ");
printf("%u%u%u",(rb>>2)&1,(rb>>1)&1,(rb>>0)&1);
printf(" :");
if(ra&4) sa=(ra|((-1)<<3)); else sa=ra;
if(rb&4) sb=(rb|((-1)<<3)); else sb=rb;
sc = sa - sb;
//printf("%u(%2d) - %u(%2d)",ra,sa,rb,sb);
printf("%2d - %2d = %2d",sa,sb,sc);
printf(" : ");
rc=(~rb)&7;
printf("%u%u%u",(ra>>2)&1,(ra>>1)&1,(ra>>0)&1);
printf(" + ");
printf("%u%u%u",(rc>>2)&1,(rc>>1)&1,(rc>>0)&1);
printf(" + 1 = ");
rd=ra+rc+1;
if(rd&4) sd=(rd|((-1)<<3)); else sd=rd;
re=(ra&3)+(rc&3)+1;
ov=0;
if((ra&4)==(rc&4)) ov = ((rd>>3)&1)^((rd>>2)&1);
ovx = ((rd>>3)&1)^((re>>2)&1);
ovy=0;
if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
printf("%u%u%u",(rd>>2)&1,(rd>>1)&1,(rd>>0)&1);
printf(" C %u O %u %u %u ",(rd>>3)&1,ov,ovx,ovy);
sc = sa - sb;
if(sc>3) printf("X");
if(sc<(-4)) printf("X");
printf("\n");
}
}
}
給
000 + 000 : 0 + 0 = 0 :000 + 000 + 0 = 000 C 0 O 0 0 0
000 + 001 : 0 + 1 = 1 :000 + 001 + 0 = 001 C 0 O 0 0 0
000 + 010 : 0 + 2 = 2 :000 + 010 + 0 = 010 C 0 O 0 0 0
000 + 011 : 0 + 3 = 3 :000 + 011 + 0 = 011 C 0 O 0 0 0
000 + 100 : 0 + -4 = -4 :000 + 100 + 0 = 100 C 0 O 0 0 0
000 + 101 : 0 + -3 = -3 :000 + 101 + 0 = 101 C 0 O 0 0 0
000 + 110 : 0 + -2 = -2 :000 + 110 + 0 = 110 C 0 O 0 0 0
000 + 111 : 0 + -1 = -1 :000 + 111 + 0 = 111 C 0 O 0 0 0
001 + 000 : 1 + 0 = 1 :001 + 000 + 0 = 001 C 0 O 0 0 0
001 + 001 : 1 + 1 = 2 :001 + 001 + 0 = 010 C 0 O 0 0 0
001 + 010 : 1 + 2 = 3 :001 + 010 + 0 = 011 C 0 O 0 0 0
001 + 011 : 1 + 3 = 4 :001 + 011 + 0 = 100 C 0 O 1 1 1 X
001 + 100 : 1 + -4 = -3 :001 + 100 + 0 = 101 C 0 O 0 0 0
001 + 101 : 1 + -3 = -2 :001 + 101 + 0 = 110 C 0 O 0 0 0
001 + 110 : 1 + -2 = -1 :001 + 110 + 0 = 111 C 0 O 0 0 0
001 + 111 : 1 + -1 = 0 :001 + 111 + 0 = 000 C 1 O 0 0 0
010 + 000 : 2 + 0 = 2 :010 + 000 + 0 = 010 C 0 O 0 0 0
010 + 001 : 2 + 1 = 3 :010 + 001 + 0 = 011 C 0 O 0 0 0
010 + 010 : 2 + 2 = 4 :010 + 010 + 0 = 100 C 0 O 1 1 1 X
010 + 011 : 2 + 3 = 5 :010 + 011 + 0 = 101 C 0 O 1 1 1 X
010 + 100 : 2 + -4 = -2 :010 + 100 + 0 = 110 C 0 O 0 0 0
010 + 101 : 2 + -3 = -1 :010 + 101 + 0 = 111 C 0 O 0 0 0
010 + 110 : 2 + -2 = 0 :010 + 110 + 0 = 000 C 1 O 0 0 0
010 + 111 : 2 + -1 = 1 :010 + 111 + 0 = 001 C 1 O 0 0 0
011 + 000 : 3 + 0 = 3 :011 + 000 + 0 = 011 C 0 O 0 0 0
011 + 001 : 3 + 1 = 4 :011 + 001 + 0 = 100 C 0 O 1 1 1 X
011 + 010 : 3 + 2 = 5 :011 + 010 + 0 = 101 C 0 O 1 1 1 X
011 + 011 : 3 + 3 = 6 :011 + 011 + 0 = 110 C 0 O 1 1 1 X
011 + 100 : 3 + -4 = -1 :011 + 100 + 0 = 111 C 0 O 0 0 0
011 + 101 : 3 + -3 = 0 :011 + 101 + 0 = 000 C 1 O 0 0 0
011 + 110 : 3 + -2 = 1 :011 + 110 + 0 = 001 C 1 O 0 0 0
011 + 111 : 3 + -1 = 2 :011 + 111 + 0 = 010 C 1 O 0 0 0
100 + 000 :-4 + 0 = -4 :100 + 000 + 0 = 100 C 0 O 0 0 0
100 + 001 :-4 + 1 = -3 :100 + 001 + 0 = 101 C 0 O 0 0 0
100 + 010 :-4 + 2 = -2 :100 + 010 + 0 = 110 C 0 O 0 0 0
100 + 011 :-4 + 3 = -1 :100 + 011 + 0 = 111 C 0 O 0 0 0
100 + 100 :-4 + -4 = -8 :100 + 100 + 0 = 000 C 1 O 1 1 1 X
100 + 101 :-4 + -3 = -7 :100 + 101 + 0 = 001 C 1 O 1 1 1 X
100 + 110 :-4 + -2 = -6 :100 + 110 + 0 = 010 C 1 O 1 1 1 X
100 + 111 :-4 + -1 = -5 :100 + 111 + 0 = 011 C 1 O 1 1 1 X
101 + 000 :-3 + 0 = -3 :101 + 000 + 0 = 101 C 0 O 0 0 0
101 + 001 :-3 + 1 = -2 :101 + 001 + 0 = 110 C 0 O 0 0 0
101 + 010 :-3 + 2 = -1 :101 + 010 + 0 = 111 C 0 O 0 0 0
101 + 011 :-3 + 3 = 0 :101 + 011 + 0 = 000 C 1 O 0 0 0
101 + 100 :-3 + -4 = -7 :101 + 100 + 0 = 001 C 1 O 1 1 1 X
101 + 101 :-3 + -3 = -6 :101 + 101 + 0 = 010 C 1 O 1 1 1 X
101 + 110 :-3 + -2 = -5 :101 + 110 + 0 = 011 C 1 O 1 1 1 X
101 + 111 :-3 + -1 = -4 :101 + 111 + 0 = 100 C 1 O 0 0 0
110 + 000 :-2 + 0 = -2 :110 + 000 + 0 = 110 C 0 O 0 0 0
110 + 001 :-2 + 1 = -1 :110 + 001 + 0 = 111 C 0 O 0 0 0
110 + 010 :-2 + 2 = 0 :110 + 010 + 0 = 000 C 1 O 0 0 0
110 + 011 :-2 + 3 = 1 :110 + 011 + 0 = 001 C 1 O 0 0 0
110 + 100 :-2 + -4 = -6 :110 + 100 + 0 = 010 C 1 O 1 1 1 X
110 + 101 :-2 + -3 = -5 :110 + 101 + 0 = 011 C 1 O 1 1 1 X
110 + 110 :-2 + -2 = -4 :110 + 110 + 0 = 100 C 1 O 0 0 0
110 + 111 :-2 + -1 = -3 :110 + 111 + 0 = 101 C 1 O 0 0 0
111 + 000 :-1 + 0 = -1 :111 + 000 + 0 = 111 C 0 O 0 0 0
111 + 001 :-1 + 1 = 0 :111 + 001 + 0 = 000 C 1 O 0 0 0
111 + 010 :-1 + 2 = 1 :111 + 010 + 0 = 001 C 1 O 0 0 0
111 + 011 :-1 + 3 = 2 :111 + 011 + 0 = 010 C 1 O 0 0 0
111 + 100 :-1 + -4 = -5 :111 + 100 + 0 = 011 C 1 O 1 1 1 X
111 + 101 :-1 + -3 = -4 :111 + 101 + 0 = 100 C 1 O 0 0 0
111 + 110 :-1 + -2 = -3 :111 + 110 + 0 = 101 C 1 O 0 0 0
111 + 111 :-1 + -1 = -2 :111 + 111 + 0 = 110 C 1 O 0 0 0
000 - 000 : 0 - 0 = 0 : 000 + 111 + 1 = 000 C 1 O 0 0 0
000 - 001 : 0 - 1 = -1 : 000 + 110 + 1 = 111 C 0 O 0 0 0
000 - 010 : 0 - 2 = -2 : 000 + 101 + 1 = 110 C 0 O 0 0 0
000 - 011 : 0 - 3 = -3 : 000 + 100 + 1 = 101 C 0 O 0 0 0
000 - 100 : 0 - -4 = 4 : 000 + 011 + 1 = 100 C 0 O 1 1 1 X
000 - 101 : 0 - -3 = 3 : 000 + 010 + 1 = 011 C 0 O 0 0 0
000 - 110 : 0 - -2 = 2 : 000 + 001 + 1 = 010 C 0 O 0 0 0
000 - 111 : 0 - -1 = 1 : 000 + 000 + 1 = 001 C 0 O 0 0 0
001 - 000 : 1 - 0 = 1 : 001 + 111 + 1 = 001 C 1 O 0 0 0
001 - 001 : 1 - 1 = 0 : 001 + 110 + 1 = 000 C 1 O 0 0 0
001 - 010 : 1 - 2 = -1 : 001 + 101 + 1 = 111 C 0 O 0 0 0
001 - 011 : 1 - 3 = -2 : 001 + 100 + 1 = 110 C 0 O 0 0 0
001 - 100 : 1 - -4 = 5 : 001 + 011 + 1 = 101 C 0 O 1 1 1 X
001 - 101 : 1 - -3 = 4 : 001 + 010 + 1 = 100 C 0 O 1 1 1 X
001 - 110 : 1 - -2 = 3 : 001 + 001 + 1 = 011 C 0 O 0 0 0
001 - 111 : 1 - -1 = 2 : 001 + 000 + 1 = 010 C 0 O 0 0 0
010 - 000 : 2 - 0 = 2 : 010 + 111 + 1 = 010 C 1 O 0 0 0
010 - 001 : 2 - 1 = 1 : 010 + 110 + 1 = 001 C 1 O 0 0 0
010 - 010 : 2 - 2 = 0 : 010 + 101 + 1 = 000 C 1 O 0 0 0
010 - 011 : 2 - 3 = -1 : 010 + 100 + 1 = 111 C 0 O 0 0 0
010 - 100 : 2 - -4 = 6 : 010 + 011 + 1 = 110 C 0 O 1 1 1 X
010 - 101 : 2 - -3 = 5 : 010 + 010 + 1 = 101 C 0 O 1 1 1 X
010 - 110 : 2 - -2 = 4 : 010 + 001 + 1 = 100 C 0 O 1 1 1 X
010 - 111 : 2 - -1 = 3 : 010 + 000 + 1 = 011 C 0 O 0 0 0
011 - 000 : 3 - 0 = 3 : 011 + 111 + 1 = 011 C 1 O 0 0 0
011 - 001 : 3 - 1 = 2 : 011 + 110 + 1 = 010 C 1 O 0 0 0
011 - 010 : 3 - 2 = 1 : 011 + 101 + 1 = 001 C 1 O 0 0 0
011 - 011 : 3 - 3 = 0 : 011 + 100 + 1 = 000 C 1 O 0 0 0
011 - 100 : 3 - -4 = 7 : 011 + 011 + 1 = 111 C 0 O 1 1 1 X
011 - 101 : 3 - -3 = 6 : 011 + 010 + 1 = 110 C 0 O 1 1 1 X
011 - 110 : 3 - -2 = 5 : 011 + 001 + 1 = 101 C 0 O 1 1 1 X
011 - 111 : 3 - -1 = 4 : 011 + 000 + 1 = 100 C 0 O 1 1 1 X
100 - 000 :-4 - 0 = -4 : 100 + 111 + 1 = 100 C 1 O 0 0 0
100 - 001 :-4 - 1 = -5 : 100 + 110 + 1 = 011 C 1 O 1 1 1 X
100 - 010 :-4 - 2 = -6 : 100 + 101 + 1 = 010 C 1 O 1 1 1 X
100 - 011 :-4 - 3 = -7 : 100 + 100 + 1 = 001 C 1 O 1 1 1 X
100 - 100 :-4 - -4 = 0 : 100 + 011 + 1 = 000 C 1 O 0 0 0
100 - 101 :-4 - -3 = -1 : 100 + 010 + 1 = 111 C 0 O 0 0 0
100 - 110 :-4 - -2 = -2 : 100 + 001 + 1 = 110 C 0 O 0 0 0
100 - 111 :-4 - -1 = -3 : 100 + 000 + 1 = 101 C 0 O 0 0 0
101 - 000 :-3 - 0 = -3 : 101 + 111 + 1 = 101 C 1 O 0 0 0
101 - 001 :-3 - 1 = -4 : 101 + 110 + 1 = 100 C 1 O 0 0 0
101 - 010 :-3 - 2 = -5 : 101 + 101 + 1 = 011 C 1 O 1 1 1 X
101 - 011 :-3 - 3 = -6 : 101 + 100 + 1 = 010 C 1 O 1 1 1 X
101 - 100 :-3 - -4 = 1 : 101 + 011 + 1 = 001 C 1 O 0 0 0
101 - 101 :-3 - -3 = 0 : 101 + 010 + 1 = 000 C 1 O 0 0 0
101 - 110 :-3 - -2 = -1 : 101 + 001 + 1 = 111 C 0 O 0 0 0
101 - 111 :-3 - -1 = -2 : 101 + 000 + 1 = 110 C 0 O 0 0 0
110 - 000 :-2 - 0 = -2 : 110 + 111 + 1 = 110 C 1 O 0 0 0
110 - 001 :-2 - 1 = -3 : 110 + 110 + 1 = 101 C 1 O 0 0 0
110 - 010 :-2 - 2 = -4 : 110 + 101 + 1 = 100 C 1 O 0 0 0
110 - 011 :-2 - 3 = -5 : 110 + 100 + 1 = 011 C 1 O 1 1 1 X
110 - 100 :-2 - -4 = 2 : 110 + 011 + 1 = 010 C 1 O 0 0 0
110 - 101 :-2 - -3 = 1 : 110 + 010 + 1 = 001 C 1 O 0 0 0
110 - 110 :-2 - -2 = 0 : 110 + 001 + 1 = 000 C 1 O 0 0 0
110 - 111 :-2 - -1 = -1 : 110 + 000 + 1 = 111 C 0 O 0 0 0
111 - 000 :-1 - 0 = -1 : 111 + 111 + 1 = 111 C 1 O 0 0 0
111 - 001 :-1 - 1 = -2 : 111 + 110 + 1 = 110 C 1 O 0 0 0
111 - 010 :-1 - 2 = -3 : 111 + 101 + 1 = 101 C 1 O 0 0 0
111 - 011 :-1 - 3 = -4 : 111 + 100 + 1 = 100 C 1 O 0 0 0
111 - 100 :-1 - -4 = 3 : 111 + 011 + 1 = 011 C 1 O 0 0 0
111 - 101 :-1 - -3 = 2 : 111 + 010 + 1 = 010 C 1 O 0 0 0
111 - 110 :-1 - -2 = 1 : 111 + 001 + 1 = 001 C 1 O 0 0 0
111 - 111 :-1 - -1 = 0 : 111 + 000 + 1 = 000 C 1 O 0 0 0
所以除了你將有一個這樣的(根據定義簽名的溢出標誌是當你解釋比特簽訂)
011 + 001 : 3 + 1 = 4 :011 + 001 + 0 = 100 C 0 O 1 1 1 X
所以1 + 3(001 + 011)=位模式100,在三位二進制補碼世界中的值爲-4,所以1 + 3 = -4這是錯誤的,因此有符號溢出,我們不能用三位表示+4。在x86上,這相當於127 + 1(0x7F + 0x01)的8位加法。基本上所有正數的組合都會導致128(或更大)的126 + 2,125 + 3 124 + 4等等。都有這個問題。
010 + 010 : 2 + 2 = 4 :010 + 010 + 0 = 100 C 0 O 1 1 1 X
我做了加法和減法。減法邏輯上來自兩個補充概念反轉並加1.所以減法c = a-b使用相反的c = a +(-b),並且從二進制補碼我們知道這意味着c = a +((〜b)+1 )或c = a + b + 1。加法是c = a + b + 0,後者1或0是lsbit的進位。
現在採取這一步進一步加法c = a + b + cin,減法c = a +〜b +〜cin。你反轉第二個操作數和進位。但是這是處理器特定的,因爲一些處理器反轉執行(我認爲x86是一個),使其成爲「借位」而不是「進位」進行減法。然後,如果你有這些指令(這些邏輯對於那些不會在一個sbb上反轉的cin),那麼混淆了用於加入進位或用借位進行減法的概念
我計算了溢出標誌三個不同(真的? ) 方法。
ov=0;
if((ra&4)==(rc&4)) ov = ((rd>>3)&1)^((rd>>2)&1);
ovx = ((rd>>3)&1)^((re>>2)&1);
ovy=0;
if((ra&4)==(rc&4)) if((rd&4) != (ra&4)) ovy=1;
OV就像是在你的文字,你正在閱讀,如果符號相同進入加法器則溢是開展與結果的最高位異或運算。
OVX溢出攜帶的定義相比,進行最高位
和ovy是一條捷徑,如果你想弄清楚溢出,但不具有對寄存器的N + 1位可以使用(如何你會發現使用32位變量溢出的語言,你無法看到執行嗎?像我在代碼中顯示的那樣,有許多方法,但是也可以簡單地檢查msbits的工作方式)。
然後,如果結果不符合可用位數然後溢出,那麼最後的X也是溢出的定義。對於無符號(進位)和有符號(溢出)溢出,爲真。因爲這是關於溢出的,那麼這是關於有符號數的,所以對於我的三位系統,只能從-4到+3任何高於+3或低於-4的任何值,並且打印輸出結尾處的X表明,所以這是在這個簡化示例中顯示溢出的第四種方式。
同樣,上面的輸出是通用邏輯如何實現的,然後您會看到處理器系列與執行標誌之間的細微差別,即某些處理器反轉執行以使其成爲借位並且一些處理器不執行相減。真正的真實邏輯會將一堆3個輸入(兩個操作數並帶入)兩個輸出(結果和執行)加法器級聯在一起,儘管在HDL語言中可以使用加號運算符並解決此問題(並且在這些語言中也需要一個這些快捷方式沒有檢查進位與執行)
如果你使用booloean方程,你應該能夠發現計算溢出的三種方法是等價的,不僅僅是在這裏的實驗,而是在數學上。
我認爲你在書中發現了一個錯誤;)注意它之前說過:_當兩個加法操作數的符號不同時,從不會發生超額流量,所以也許他的意思是這個公式只適用於符號不匹配的情況。 – Jester
進位基本上是「無符號溢出」溢出是「有符號」溢出。不確定你的書,但是如果兩個操作數具有相同的符號並且結果是不同的符號,那麼簽名溢出是捷徑。技術上在msbit上,如果進位和執行不相同,那麼你有一個簽名溢出。如果你添加-n和-y並得到一些正數,那麼你在寄存器中沒有足夠的位來存儲結果。例如,0x80 + 0x80 = 0x00。所以傑斯特肯定會接受他的評論。 –
ahh,當然,如果溢出的先決條件是兩個符號都是相同的,那麼確定xor是一個(簡單的)方法來判斷兩位是相同還是不同。所以如果操作數msbits匹配,THEN異或結果msbit與操作數msbit如果一個然後兩個位匹配如果零然後他們沒有。我認爲x86是一種倒置進位,使其成爲減法的借位,所以你必須小心地在正確的時間取得進位。 –