CPU如何區分溢出和自然進位?
之前學習補碼的時候倒是學會了基本概念,但是最近又接觸時發現還有不清楚的地方,所以又研究了下
今天的核心問題的“CPU是如何區分高位自然舍棄和溢出的?”
先給出結論:如果運算中,數值位最高位(也就是有符號數的正數第二位)和符號位(也就是正數第一位)同時進位,則是自然舍棄。兩者間如果只有一個進位,則是溢出。
下面來講解一下。運算的所有情況可以划分為四種:
- 符號位進位,數值最高位不進位
- 符號位不進位,數值最高位進位
- 符號位和數值最高位都進位
- 符號位和數值最高位都不進位
對於第四種情況,就沒什么好說了,都不進位的話根本涉及不到區分的問題。
對於第一種和第二種情況都好理解:對於第一種情況,既然數值最高位沒有進,那么符號位的進位就一定是完全由符號位導致的,也就是說符號位一定是兩個1,那么這樣進位的結果就是符號位為0——兩個負數加法運算結果為正數,當然是溢出了。第二種也是同理,數值最高位進位了而符號位沒有進,只能說明原來符號位是兩個0,那么就是兩個正數相加結果為負數,溢出無疑了。
比較復雜一點的是情況3,它又可以細分為:
- 兩個數符號位都是1
- 一個數符號位為1,另一個是0
要講清楚這里的內容,我們要了解一下究竟什么是溢出?我們以4位二進制數為例,它的表示范圍是[-8,7]。注意,溢出是結果錯誤,但不是二進制加法本身有錯誤,我們所說的溢出,是指在對二進制加法的結果進行截取后,截取的結果和算術運算的結果不符,而造成溢出的原因就是計算的結果超出能表示的范圍。而對於情況2,一個正確表示的正數和一個正確表示的負數相加,結果一定是不會超出表示范圍的,這里的進位就只能是自然進位。對於1,兩個負數相加什么情況下才會溢出呢?就是超出表示范圍的情況,而對於負數,除了符號位之外,數值位0越多數就越小。在1的前提下,能找到的最小的負數就是1010和1110,其分別是-6和-2,加起來正好是-8不超范圍。所以這種情況也被證明了不會溢出了。
綜上,我們證明了只有在符號位和數值最高位兩個里面只有一個進位的時候才是溢出,依次為據我們就可以設計CPU指令了。