算术溢出
![本页使用了标题或全文手工转换](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
此条目没有列出任何参考或来源。 (2011年2月24日) |
算术溢位(arithmetic overflow)或简称为溢位(overflow)指的是:
- 在电脑领域里所发生的溢位条件是,执行单项数值计算时,当计算产生出来的结果是非常大的,大于暂存器或记忆体所能储存或表示的能力限制。
- 在电脑领域里,执行多项或累计的数值计算时,当计算产生出来的总值是非常大的,大于暂存器或记忆体所能储存或表示的能力限制。要注意的是,溢位可能会在其他位址被置换。[来源请求]
加法器是中央处理器算术逻辑单元中的核心之一。当长度为n位的两个二进制数经过加减法器运算,得到的长度为n位的结果不是正确值时,我们说发生溢出。
检查溢位
大多数的电脑都可以区别以上两种溢位条件。当加法或减法的结果发生进位,必须考量到当运算的数值与结果都是unsigned numbers(无号数值,即“正数”)型态时,运算的结果就不适合使用这个数值型态。所以,在执行无号数值(正数)的加法或减法之后检查进位旗标是非常有用的作法。“溢位”在运算结果为无号数值时容易发生,可以从有符号的运算数值预计出这类的情形(例如:两个正整数相加产生的结果为一个负数)。所以,在执行2的补数的加法或减法之后检查溢位旗标是非常有用的作法(换言之,有考虑到有号数值)。
控制溢位
有几个控制溢位的方法:
- 设计:选择正确的资料型态,尤其要注意资料长度与signed/unsigned资料符号。
- 回避:事先注意指令的运作以及检查运算的数值,或许可以确保计算出来的结果不会超过记忆体储存资料的限制。
- 控制:当它被侦测到,还有在其他的程序完成时被检测出来,那么溢位是可以被预料的。例如:两个位元大的两个数值做加法计算,这种情形最可能发生。步骤如下:先加低位元再加高位元,但是如果它必须完成低位元的运算,就会产生位元加法的运算溢位,那么就有必要做侦测和增加高位元的总和。通常CPU有支援侦测数值加法大于暂存器大小的作法,基本上这个作法是采用状态位元的方式。
- 增值:假如储存的数值过大就会被分配给其他特定的数值,这时溢位就会发生,然后传回旗标值时就会产生连续运作的现象。检查这个问题最有用的方法,就是在整体的计算结尾做一次性的检查工作,而不是检查每一个执行步骤。这个作法最常用在浮点硬体呼叫浮点运算器。
- 忽略:这是最普遍的作法,但是这个作法会得出不正确的结果,以及降低程式的安全性。
除零计算
任何数除以零的计算(Divided by zero)“不是”算术溢位的一种。在数学上只能明显算是不明确的定义(Undefined);它计算出来的结果只能当成是“没有”值,而不是非常大的无限数值。