算术溢出

算术溢出(arithmetic overflow)或简称为溢出(overflow)指的是:

  1. 电脑领域里所发生的溢出条件是,执行单项数值计算时,当计算产生出来的结果是非常大的,大于寄存器存储器所能存储或表示的能力限制。
  2. 在电脑领域里,执行多项或累计的数值计算时,当计算产生出来的总值是非常大的,大于寄存器或存储器所能存储或表示的能力限制。要注意的是,溢出可能会在其他地址被置换。[来源请求]

加法器中央处理器算术逻辑单元中的核心之一。当长度为n位的两个二进制数经过加减法器运算,得到的长度为n位的结果不是正确值时,我们说发生溢出

检查溢出

大多数的电脑都可以区别以上两种溢出条件。当加法或减法的结果发生进位,必须考量到当运算的数值与结果都是unsigned numbers(无号数值,即非负数)类型时,运算的结果就不适合使用这个数值类型。所以,在执行无号数值的加法或减法之后检查进位旗标是非常有用的作法。“溢出”在运算结果为无号数值时容易发生,可以从有符号的运算数值预计出这类的情形(例如:两个正整数相加产生的结果为一个负数)。所以,在执行2的补码的加法或减法之后检查溢出旗标是非常有用的作法(换言之,有考虑到有号数值)。

控制溢出

有几个控制溢出的方法:

  1. 设计:选择正确的资料类型,尤其要注意资料长度与signed/unsigned资料符号。
  2. 回避:事先注意指令的运作以及检查运算的数值,或许可以确保计算出来的结果不会超过存储器存储资料的限制
  3. 控制:当它被侦测到,还有在其他的程序完成时被检测出来,那么溢出是可以被预料的。例如:两个位元大的两个数值做加法计算,这种情形最可能发生。步骤如下:先加低位元再加高位元,但是如果它必须完成低位元的运算,就会产生位元加法的运算溢出,那么就有必要做侦测和增加高位元的总和。通常CPU有支持侦测数值加法大于寄存器大小的作法,基本上这个作法是采用状态位元的方式。
  4. 增值:假如存储的数值过大就会被分配给其他特定的数值,这时溢出就会发生,然后传回旗标值时就会产生连续运作的现象。检查这个问题最有用的方法,就是在整体的计算结尾做一次性的检查工作,而不是检查每一个执行步骤。这个作法最常用在浮点硬件调用浮点运算器
  5. 忽略:这是最普遍的作法,但是这个作法会得出不正确的结果,以及降低程序的安全性

除零计算

任何数除以零的计算(Divided by zero)“不是”算术溢出的一种。在数学上只能明显算是不明确的定义(Undefined);它计算出来的结果只能当成是“没有”值,而不是非常大的无限数值。

相关参见