‘壹’ 关于单片机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.优化计数逻辑:如果计数器的使用场景允许,可以优化计数逻辑,例如,使用双向计数器或者增加一个计数器来记录溢出的次数。
总结:
无论采用哪种解决方案,都需要进行严格的测试和验证,确保计数器的正常运行和可靠性。同时,应根据具体的应用需求选择合适的计数器位数和解决方案,避免过多或过少造成计数器性能不足或过度浪费的问题。