進位位(carry)與溢出位(overflow)的區別


    處理器內部以補碼表示有符號數,8個二進制位能夠表達的整數范圍是:+127 ~ -128,16位表達的范圍是:+32767 ~ -32768.如果運算結果超出了這個范圍,就是產生了溢出;有溢出,說明有符號數的運算結果不正確.

例如:3AH + 7CHB6H,就是58 + 124182,已經超出-128 ~ 127范圍,產生溢出,所以OF = 1。從另一方面看,補碼B6H表達值是-74,顯然運算結果也不正確。

     溢出標志OF和進位標志CF是兩個意義不同的標志

   進位標志表示無符號數運算結果是否超出范圍,運算結果仍然正確; 

   溢出標志表示有符號數運算結果是否超出范圍,運算結果已經不正確。

請看例子

13AH + 7CHB6H

無符號數運算:58124182,范圍內,無進位

有符號數運算: 58124182 ,范圍外,有溢出

2AAH + 7CH=(126H

無符號數運算:170124294,范圍外,有進位

有符號數運算:-8612438 ,范圍內,無溢出

處理器運算器對有符號數的運算過程(猜想):

    處理器對兩個操作數進行運算時,首先需要轉換成補碼(有符號數在計算機中都是以補碼形式存儲的),這兩個補碼按照無符號數求得結果(符號位也參與運算),如果有進位的話,舍去(即按無符號數運算產生的進位不考慮,這個進位對於有符號數運算是沒有意義的);同時,根據是否超出有符號數的范圍設置溢出標志OF

怎樣判斷有符號數運算是否產生溢出:

    只有當兩個相同符號數相加,而運算結果的符號與原數據符號相反時,產生溢出;其他情況,不會產生溢出。

編程時需要注意的: 

    應該利用哪個標志,則由程序員來決定。如果將參加運算的操作數認為是無符號數,就應該關心進位;認為是有符號數,則要注意是否溢出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM