2015-02-11 26 views
0

我無法理解什麼是「正確的」,並且在使用十六進制值進行加減運算時不正確。我想指出,我將要處理BYTE大小的數據。作爲一個例子,當我添加6C(十六進制)+ 7D(十六進制),我得到答案E9(十六進制)。現在,從我的角度來看,我知道E9是一個無符號整數的正確答案。 108(6C)+ 125(7D)= 233(E9)如何知道你的十六進制加法是否是一個有符號整數是正確的?

然而,當我試圖確定這是否是正確答案爲簽名回答我的問題出現了...

我應該思考INITIAL添加的邏輯? (並且表明由於6C(A正)+ 7D(正)E9不正確,所以不能等於E9(負符號表示法),因爲增加2個正數不能成負數。)

...或我應該說E9是不正確的,因爲它超出範圍[-128,+ 127]

..或者我應該看看它完全不同,取7D的二進制補碼並從6C中減去,看看是否那個答案適合於確定它的正確與否?

基本上,我只需要指出正確的方向尋找什麼來確定是否正確答案的簽名版本。我喜歡這些類型的一步一步的指示,但是我的彙編語言書並沒有太多幫助。

回答

1

如果有符號與無符號二進制加法沒有概念。位模式完全一樣。這些位模式的意義在於旁觀者的眼中(乘法和除法並非如此)。這是兩個補充的美麗。

0xF0 + 0x02 = 0xF2 = 240 + 2 = 242 
0xF0 + 0x02 = 0xF2 = -16 + 2 = -14 

減法,使您的生活更輕鬆

A - B = A + (-B) = A + (~B) + 1 

現在符號和無符號溢出的加法和減法有不同的定義。因此,如果你得到溢出或不確定,你是否得到有符號或無符號數的「正確」答案。

編輯

6C + 7D = E9 
108 + 125 = 233 
108 + 125 != -23 

肯定是有符號溢出,如果你對待這些有符號數,那麼你溢出來了,答案是錯誤的,如果你是治療這些以無符號數你沒有一個無符號溢出答案是正確的。

如果結果需要9位1xx,那麼無符號溢出就是執行,那麼這是一個無符號溢出。對於簽名溢出,如果執行下一個msbit和執行msbit(或另一種說法是,如果進位和執行msbit不匹配,那麼它是一個有符號溢出)。你可能有意選擇的數字,這很容易。兩個操作數的msbit都是0,進位是1,因爲如果這些是7位數字,那將是一個執行。因此對msbit的進位是1操作數爲0且0 1 + 0 + 0 = 1且進位爲0,所以進位爲1,進位爲0,有符號溢出。如果進行分析,另一種測試符號溢出的方式是,如果兩個操作數的msbit相同,並且結果的msbit不相同,那麼這是一個帶符號的溢出。

基本上這是真值表

abi or 
000 00 
001 01 v 
010 01 
011 10 
100 01 
101 10 
110 10 v 
111 11 

a和b是操作數的個MSb,i是攜帶,r爲結果o是進行,如果i和0不匹配,則它是一個簽名溢出。發生這種情況的兩種情況也是兩種情況,其中a = b和b!= r

因此,您查看msbits的兩個數字爲0 0 1,操作數與結果不匹配,簽名溢出(如果已簽名)此外,它失敗了,你不能代表可用位數的答案。

+0

據我所知,減去。因爲我可以取加減運算的2的補碼,並且通常按照你所說的加上它(A - B = A +(-B))所以你說如果沒有來自加法的溢出位,相應的答案將會是正確簽署? 6C + 7D給出了一個內部進位,但不是一個外部進位,那麼內部進位是否會被認爲是溢出,從而使得答案E9不正確(如簽名)? – 2015-02-11 22:35:09

+0

評論您的編輯:完美!這解釋了我的。感謝您花時間發佈您的詳細解釋,非常感謝。 – 2015-02-12 00:14:57

0

在大多數彙編語言中,通過檢查flags寄存器中的溢出標誌(通常稱爲O或OF或V,取決於體系結構)來檢查有符號整數溢出。任何時候進行算術運算時,如果有符號整數溢出(如果結果不是正確的有符號整數結果),OF將被設置,如果沒有溢出則清零。

在x86上,該標誌被稱爲OF,您可以使用條件分支指令(JO跳到溢出或JNO跳轉,如果沒有溢出)檢查它,或者可以使用INTO來捕獲溢出,或者SETO根據溢出設置寄存器的值。

相關問題