整理了一下匯編的匯編和進位的區別,感興趣的朋友看看。
對於無符號數來說,不存在溢出的問題,它的進位就相當於有符號數中的溢出
而對有符號數來說,不存在進位的問題
一個字節(8位) 的數有256個 (2的8次方)
一個字(16位) 的數有65536個 (2的16次方)
8個二進制位能夠表達的無符號數范圍是:0 ~ 255
16位表達的無符號數范圍是:0 ~ 65535
對於無符號數來說,不存在溢出的問題,它的進位就相當於有符號數中的溢出.
進位表示最高位有沒有向上形成進位,或向個形成借位,如果有則進位標志CF為進/借位數,但結果沒錯。
進/借位數要看 十六進制、二進制,進/借的是十六進制、二進制的最高位
處理器內部以補碼表示有符號數,
8個二進制位能夠表達的有符號數范圍是:+127 ~ -128
16位表達的有符號數范圍是:+32767 ~ -32768
如果運算結果超出了這個范圍,就是產生了溢出,有溢出,說明有符號數的運算結果不正確
溢出是指結束超出數據所表示的范圍,通俗地說是裝不下了,比如,兩個帶符號的字節數127和2相加,結果為-1,因為帶符號的字節數最大正數為127,所以超過范圍,溢出標志位OF為1,說明出錯了。
對於有符號數來說,不存在進位的問題
例如:
3AH + 7CH=B6H,就是58 + 124=182,已經超出-128 ~ 127范圍,產生溢出,所以OF=1;另一方面,補碼B6H表達真值是-74,顯然運算結果也不正確。
溢出標志OF和進位標志CF是兩個意義不同的標志.進位標志表示無符號數運算結果是否超出范圍,運算結果仍然正確;溢出標志表示有符號數運算結果是否超出范圍,運算結果已經不正確。
請看例子
例1:3AH + 7CH=B6H
無符號數運算:58+124=182,范圍內,無進位
有符號數運算: 58+124=182 ,范圍外,有溢出
例2:AAH + 7CH=(1)26H
無符號數運算:170+124=294,范圍外,有進位
有符號數運算:-86+124=28 ,范圍內,無溢出
處理器對兩個操作數進行運算時,按照無符號數求得結果,並相應設置進位標志CF;同時,根據是否超出有符號數的范圍設置溢出標志OF。
應該利用哪個標志,則由程序員來決定。也就是說,如果將參加運算的操作數認為是無符號數,就應該關心進位;認為是有符號數,則要注意是否溢出。
判斷運算結果是否溢出有一個簡單的規則:只有當兩個相同符號數相加,而運算結果的符號與原數據符號相反時,產生溢出,此時的運算結果顯然不正確。其他情況下,則不會產生溢出。
兩個正數相加(或一個正數減一個負數)得到負數,或是兩個負數相加得到正數,就是溢出了.
一個正數和一個負數相加不可能溢出