溢出,溢出的檢測方法有哪些?
在定點小數機器中,數的表示范圍為|x|<1. 在運算過程中如出現大于1的現象,稱為“溢出”。在定點機中,正常情況下溢出是不允許的。
[例12] x=+0.1011, y=+0.1001,求x+y。
[解:]
[x]補=0.1011 [y]補=0.1001
[x]補 ? 0.1011
+[y]補 0.1001
--------------------
[x+y]補 1.0100
兩個正數相加的結果成為負數,這顯然是錯誤的。
[例13] x=-0.1101, y=-0.1011,求x+y。
[解:]
[x]補=1.0011 [y]補=1.0101
[x]補 ? 1.0011
+[y]補?? ?1.0101
--------------------
[x+y]補 ? 0.1000
兩個負數相加的結果成為正數,這同樣是錯誤的。
之所以發(fā)生錯誤,是因為運算結果產生了溢出。兩個正數相加,結果大于機器所能表示的最大正數,稱為上溢。而兩個負數相加,結果小于機器所能表示的最小負數,稱為下溢。
為了判斷“溢出”是否發(fā)生,可采用兩種檢測的方法。第一種方法是采用雙符號位法,這稱為“變形補碼”或“模4補碼”,從而可使模2補碼所能表示的數的范圍擴大一倍。變形補碼定義為
????????????????????????? (2.22)
或用同余式表示為
[x]補=4+x (mod 4)
下式也同樣成立:
[x]補+[y]補=[x+y]補??? (mod 4)
為了得到兩數變形補碼之和等于兩數之和的變形補碼,同樣必須:
1. 兩個符號位都看作數碼一樣參加運算
2. 兩數進行以4位模的加法,即最高符號位上產生的進位要丟掉。
采用變形補碼后,如果兩個數相加后,其結果的符號位出現“01”或“10”兩種組合時,表示發(fā)生溢出。這是因為兩個絕對值小于1的數相加,其結果不會大于或等于2,所以最高符號位永遠表示結果的正確符號。
[例14] x=+0.1100, y=+0.1000,求x+y。
[解:]
[x]補=00.1100, [y]補=00.1000
[x]補 00.1100
?。玔y]補 00.1000
-------------------
????????????????01.0100
兩個符號位出現“01”,表示已溢出,即結果大于+1。
[例15] x=-0.1100, y=-0.1000,求x+y。
[解:]
[x]補=11.0100, [y]補=11.1000
[x]補 11.0100
?。玔y]補 11.1000
-------------------
?????????? ?10.1100
兩個符號位出現“10”,表示已溢出,即結果小于-1。
由此可以得出如下結論:
1. 當以模4補碼運算,運算結果的二符號位相異時,表示溢出;相同時,表示未溢出。故溢出邏輯表達式為V=Sf1⊕Sf2,其中Sf1和Sf2分別為最高符號位和第二符號位。此邏輯表達式可用異或門實現。
2. 模4補碼相加的結果,不論溢出與否,最高符號位始終指示正確的符號。
第二種溢出檢測方法是采用單符號位法。從例1和例2中看到,當最高有效位產生進位而符號位無進位時,產生上溢;當最高有效位無進位而符號位有進位時,產生下溢。故溢出邏輯表達式為V=Cf⊕Co,其中Cf為符號位產生的進位,Co為最高有效位產生的進位。此邏輯表達式也可用異或門實現。
在定點機中當運算結果發(fā)生溢出時,機器通過邏輯電路自動檢查出溢出,并進行中斷處理。
非常好我支持^.^
(510) 97.7%
不好我反對
(12) 2.3%
相關閱讀:
- [電子說] 請問異步FIFO的溢出操作時怎么樣判斷的? 2023-10-18
- [電子說] 如何解決內存溢出 2023-09-25
- [電子說] WebP圖像編解碼庫libwebp存在堆緩沖區(qū)溢出漏洞 2023-09-25
- [電子說] STM32定時器溢出的工作原理是什么? 2023-08-16
- [電子說] 什么是ThreadLocal?一文讓你徹底掌握ThreadLocal 2023-08-07
- [電子說] C語言的哪些函數會導致內存溢出?如何改進? 2023-08-01
- [接口/總線/驅動] 如何使用CANlib檢測CAN幀溢出情況? 2023-07-30
- [嵌入式技術] Embedded Studio堆棧溢出預防功能 2023-07-14
( 發(fā)表人:admin )