『壹』 關於單片機OV溢出的問題
對於單片機,不如先將兩個操作數擴大一個類型,如原來是signed
char
就擴成signed
short然後再運算,運算後再判斷是否在signed
char
下相加會溢出,即大於127。這個比相加後再判斷要好一點。
數據長度擴大後,肯定不會出現溢出了。
『貳』 單片機程序狀態字PSW中的CY 和OV
首先,要知道,什麼是溢出?
一般來說,容器太小,盛不下了,就會溢出。
在計算機方面,溢出,就是數據太大,超出了預定的范圍。
數字,在計算機中,都是用機器碼代表的。
人們最常用的「自然數」和「整數」,其表達范圍如下:
機器碼,無論代表什麼數字,只要運算結果超出預定范圍,就是【溢出】。
但是,在計算機專業人的嘴裡,就不一樣了。
【無符號數的溢出】,不叫溢出,要叫做【進位】。
【帶符號數的溢出】,才叫做【溢出】。
搞計算機的這些人,基本概念不清,卻自命不凡!
冒充腦迴路清奇。。。正常人對此,就只能無語了。
---------------------------
那麼,就按照計算機專業的說法吧:
溢出,是指「補碼運算結果超出范圍」。
溢出的特徵,是「符號錯誤」。
知道了這些,判斷是否溢出,就很容易了。
CPU 每次做完運算,就會給出結果和「進位標志位 CY」和「溢出標志位 OV」。
如果 OV=1,就代表:剛剛做的計算,發生了溢出。
人工判斷是否溢出,有如下六個方法。
一、無符號數的運算,肯定不會溢出。只有進位。
二、只有:正+正、負+負,才有可能超出范圍。不是這些,就絕不會溢出。
三、人工用十進制數值計算。和,如果沒有超出范圍,就沒有溢出。
四、人工用二進制補碼計算。和的符號,如果正確,就沒有溢出。
五、編個程序,讓計算機計算。然後觀察溢出標志位,為零,就沒有溢出。
六、人工用補碼計算,如「最高位的進位」和「次高位的進位」相同,就沒有溢出。
第六種,本是 CPU 的硬體所用的方法。
硬體,其理論基礎,是很晦澀難懂的。
異或運算,一般也不需要初學者掌握。
但是,一些愛得瑟的老師,偏愛介紹這種方法。
卻又拿不出任何的理論!
其實,這是很無聊的表現,就是想著難為學生。
『叄』 什麼叫做單片機中的「溢出標志」
單片機中的狀態寄存器有這樣一個標志位,因為在加減乘除中,都會出現運算結果超出機器所能表示的范圍,所以用來表示是否溢出。還有一個作用是在計數器/定時器中用來計算計數值是否已經達到預先設定的值。
『肆』 如何解決計數器溢出的問題
計數器溢出是指計數器的值超過了其能夠表示的最大范圍,導致計數器無法繼續正常計數。解決計數器溢出的問題通常有以下幾種方法:
1.增加計數器位數:通過增加計數器的位數來擴大其能夠表示的數值范圍。例如,如果一個2位的二進制計數器溢出了,可以升級到3位或更多位數的計數器,以支持更大的數值。
2.使用模運算:在計數器達到最大值後,通過模運算(取余數)來重置計數器的值。這種方法適用於循環計數的情況,例如,當一個計數器從0計數到255後,可以通過模256運算來重置為0。
3.軟體計數:在計數器溢出之前,將計數器的值保存在內存中,然後清零計數器。當計數器再次達到溢出閾值時,從內存中讀取之前保存的值並繼續計數。這樣可以實現無限擴展計數器范圍的效果。
4.中斷處理:在計數器溢出時,通過中斷信號通知處理器,然後由處理器來處理溢出事件。例如,在8051單片機中,定時器/計數器的溢出會觸發中斷,處理器可以捕獲這個中斷並執行相應的處理程序。
5.監控和預防:實時監控計數器的值,並在接近溢出閾值時採取措施。例如,可以通過軟體檢查計數器的值,並在必要時重置計數器或執行其他預防措施。
6.使用專門的硬體:某些硬體設計有防止溢出的機制,例如,一些微控制器和計數器晶元具有可配置的計數器模式,可以自動重置或翻轉計數方向。
7.優化計數邏輯:如果計數器的使用場景允許,可以優化計數邏輯,例如,使用雙向計數器或者增加一個計數器來記錄溢出的次數。
總結:
無論採用哪種解決方案,都需要進行嚴格的測試和驗證,確保計數器的正常運行和可靠性。同時,應根據具體的應用需求選擇合適的計數器位數和解決方案,避免過多或過少造成計數器性能不足或過度浪費的問題。