2011-08-22 42 views

回答

2

這可能是任何體面的編程計算器可以告訴你的東西,但假設它以八位包裝,這就是結果。

   [ hex,unsigned,signed] 
    10111011 [0xBB,  187, -69] 
+ 11010101 [0xD5,  213, -43] 
    -------- 
= (1)10010000 [0x90,  144, -112] 

您可以手動執行此操作過程如下:

set carry to zero 
for each position starting at right side, progressing left: 
    set sum to carry 
    add bit from position in first number to sum 
    add bit from position in second number to sum 
    if sum is greater than one: 
     subtract two from sum 
     set carry to one 
    else 
     set carry to zero 
    end if 
    store sum to position of result 
end for 
+0

...如果存在,溢出位將被設置。 ;) – Lucero

+0

我不得不手動添加溢出位。在'結束'後我添加'result [0] = carry'。我錯過了什麼嗎? – 2013-01-18 22:20:46

+0

@詹姆斯,如果你只有8位,通常是位0到7,所以把'carry'放入'result [0]'是錯誤的。而且,如果你的位是1到8,result [0]的出現意味着你有_nine_位而不是8位。通常會發生什麼結果將環繞,進位的最終值將表明這一點。 – paxdiablo

0

約補的好處是,你不需要知道你是否已簽署或無符號數。只需取二進制表示,添加並丟棄溢出位。如果你已經離開了可表示數字的範圍,好吧,好運氣。但增加兩個負數並獲得正數應該引起懷疑。

在實踐注意:不要嘗試防止用C溢出通過詢問之類的東西

a = b+c; 
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) { 
    ... 
} 

這將在標準調試版本可能工作,但C(和C++)編譯器被允許優化此檢查。 (這是更經常看到的無符號算術,if (a >= (a+b)) { ... }gcc -Wall將提醒它知道這是錯誤的,這是好的,因爲C標準說溢出是不確定的行爲。)

我不知道在範圍有限的整數類型的其他語言中情況如何。