2011-01-10 41 views
4

我已經完成了一半以上的學習程序集,並且我熟悉如何將有符號和無符號整數呈現在位上的概念,我知道這似乎是一個奇怪的問題,答案會很明顯,但我想知道是否使用像加法這樣的算術運算對於一對數字來說是有意義的,其中一個數字被認爲是有符號數,另一個是無符號數,我想過下面的多個例子會產生正確的結果:會對一對有符號和無符號數進行算術運算是否合法?

10000001(1字節的整數,並認爲無符號,相當於129)
+ (1字節的整數,並認爲符號(2的補碼系統),相當於-1)


10000000(1字節的整數和在邏輯等效無符號128)

現在,如果上限值是在AL寄存器,我們有以下的指令代碼(GAS格式):

addb -1, %al 

那麼EFLAGS寄存器的進位標誌(CF)將在操作完成後置位並通知實際上沒有發生的溢出,也可能是因爲溢出標誌(OF)溢出時有一個無符號數應該引用EFLAGS寄存器。所以我很困惑,如果做這樣的事情是明智的。

回答

1

我上,那是我的主要關注,答案是閱讀文章後清除問題發現了這個非常漂亮的article

3

數字或操作是否有符號或無符號只是解釋的問題。當你添加的時候會發生什麼,那就是兩個數字加在一起,在進位標誌中產生100000001(因爲它「離開了前端」)。然後由後續操作來解釋它的含義(如果你在其他地方使用該位,就像你將操作視爲無符號的添加而沒有包裝一樣;如果將這個位置丟棄,就好像你正在做一個簽名加)。

+0

只有結果與所有操作數的大小相同時,這纔是真實的。處理器通常具有乘法指令,其結果大小是操作數大小的兩倍;有些還有操作數大小不同的附加指令(例如,68000上的ADD.W D3,A5或TMS32050上的ADD * +都會簽名擴展16位值並將其添加到32 TMS也有'ADDU * +'來將一個16位無符號值加到一個32位寄存器中 – supercat 2014-01-25 17:09:08

3

在二進制級別,只有一個加法運算:

0101 + (5) 
1010 = (unsigned 10 or signed -6) 
-------- 
1111 (unsigned 15 or signed -1) 

怎麼樣的進位和溢出標誌,他們是根據一個簡單的規則都設置。 CF可以用來檢測一個Oveflow,如果我們認爲這些操作數是無符號的,並且OF檢測到這個Oveflow,我們認爲它們都是有符號的。這兩個標誌都根據結果進行設置,並由您決定使用哪些標誌。

爲標誌的實際計算公式爲

OF = CF xor MSB_of_result. 

這意味着,如果我們增加了兩個正數(即我們考慮簽署),那麼如果結果是否定的,那麼它oveflowed。

1

「簽名」和「無符號」是解釋。彙編指令通常將解釋記錄在案。我不知道任何有ADD-SIGNED-UNSIGNED指令的體系結構將其一個參數解釋爲有符號值,另一個解釋爲無符號。這似乎也沒什麼價值。用二進制補碼整數算術,唯一的區別就是在某些標誌寄存器中。

+0

雖然處理器提供混合模式乘法指令並不常見,但擴展精度有符號值將需要這樣的操作,無論它們是通過專用指令還是代碼序列來實現。 – supercat 2014-01-25 17:04:28

6

在數學上,您不需要添加帶符號或無符號數字。只有數值模2 (假設你有32位寄存器)。這些值涵蓋了連續整數的範圍,但您可以自由地將該範圍解釋爲從任何地方開始。 「簽名」和「無符號」只是兩種這樣的解釋。

換句話說,對於4位寄存器,「1011」的無符號解釋爲11,而帶符號的解釋爲-5。但是隻有一個值(數學家通常稱之爲「十一個模數」,因爲數學家傳統上喜歡未經簽名的解釋)。例如,如果將「0110」添加到該值(在有符號和無符號解釋中爲「6」),則會得到「0001」,這是正確的值:減五加六收益1,以及十一加6是17時減小模2 其也等於一(17是一加16;「減少模2 」是關於由16除以[這就是2 ]和保持僅餘數)。

另一種說法如下:數字值的(二進制)位數在概念上在左邊是無限的。 CPU寄存器只保留最右邊的32位。無符號解釋是關於通常假設所有最左邊的位都是零。有符號解釋是關於傳統上所有最左邊的位具有與位31相同的值(即,全部爲零或全部爲1)的假設。無論哪種方式,當您執行加法(或減法或乘法)時,都會從右向左傳播,而不是相反,因此忽略的位的值對32位結果沒有任何影響。所以只有一個「添加」操作碼,它並不在乎它的操作數在程序員的大腦中是「簽名」還是「未簽名」。

執行而不是與模數運算兼容的操作時必須考慮簽名。轉換爲顯示的十進制數字序列就是這樣一種操作。然而,更常見的情況是比較。數值模2 未訂購;它們處於一種循環循環中(當你添加1到2,並且減少模2 時,你會回到0)。只有在整個整數範圍內考慮整數時,比較纔有意義。此時,您必須決定是使用簽名還是未簽名的解釋。這就是爲什麼x86處理器同時提供jg(如果更大,有符號解釋)和ja(如果上面跳轉,無符號解釋)。

+0

+1爲最完整和通用的答案。 – ruslik 2011-01-10 16:37:12