什么是整数溢出错误?

时间:2010-04-14 21:46:16

标签: language-agnostic integer-overflow

什么是整数溢出错误? 为什么我关心这样的错误? 有哪些避免或预防方法?

10 个答案:

答案 0 :(得分:18)

当您尝试表示一个大于整数类型可以处理的最大数字的数字时,会发生整数溢出。

如果您尝试在一个字节中表示数字300,则会出现整数溢出(最大值为255)。两个字节中的100,000也是整数溢出(65,535是最大值)。

你需要关心它,因为数学运算不会像你期望的那样运作。如果你有一个整数溢出,A + B实际上并不等于A和B之和。

通过不首先创建条件来避免它(通常是通过选择足够大的整数类型使您不会溢出,或者通过限制用户输入以便不会发生溢出)。< / p>

答案 1 :(得分:7)

解释它的最简单方法是用一个简单的例子。想象一下,我们有一个4位无符号整数。 0将是0000而1111将是15.因此,如果你增加15而不是16,你将回到0000,因为16实际上是10000,我们不能用少于5位表示。 Ergo溢出......

在实践中,数字要大得多,如果int已经签名,它会在溢出时圈出一个大的负数,但上面基本上就是这样。

另一种看待它的方法是将它视为与汽车中的里程表在达到999999公里/英里后再次翻到零时发生的情况大致相同。

答案 2 :(得分:2)

将整数存储在内存中时,计算机会将其存储为一系列字节。这些可以表示为一系列的1和0。

例如,零将表示为00000000(8位整数),通常,127将表示为01111111。如果您将一个添加到127,这将“翻转”这些位,并将其交换为10000000,但在standard two's compliment表示中,这实际上用于表示-128。这“溢出”了价值。

使用无符号数字时,会发生同样的事情:255(11111111)加1将变为100000000,但由于只有8“位”,因此最终为00000000,这是0。

您可以通过对正确的整数大小进行适当的范围检查,或使用为您执行适当异常处理的语言来避免这种情况。

答案 3 :(得分:1)

当操作使整数值大于其最大值时,会发生整数溢出错误。

例如,如果您可以拥有的最大值是100000,而您当前的值是99999,那么添加2将使其“溢出”。

你应该关心整数溢出,因为数据可以无意中改变或丢失,并且可以使用更大的整数类型(在大多数语言中参见long int)或使用将长字符串转换为非常大的整数的方案来避免它们

答案 4 :(得分:1)

到目前为止,我希望对所有其他答案有点逆势而行,它会以某种方式接受蹩脚的破碎数学。这个问题被标记为语言无关,并且在大量语言中,整数根本不会溢出,所以这是我的讽刺答案:

  

什么是整数溢出错误?

来自计算机黑暗时代的过时神器。

  

为什么我关心它?

你没有。

  

如何避免?

使用整数不会溢出的现代编程语言。 (Lisp,Scheme,Smalltalk,Self,Ruby,Newspeak,Ioke,Haskell,请你选择......)

答案 5 :(得分:1)

溢出是指算术运算的结果不适合操作的数据类型。如果添加255 + 1,则可以使用字节大小的无符号整数溢出,因为结果(256)不适合一个字节的8位。

如果浮点运算的结果太大而无法表示浮点数据类型的指数或尾数,则可能会浮点浮点数。

当浮点运算的结果太以表示给定的浮点数据类型时,您还可以使用浮点类型下溢。例如,如果浮点数据类型可以处理-100到+100范围内的指数,并且您使用指数为-80的方形值,则结果将具有-160左右的指数,这将不适合给定的浮点数据类型。

您需要关注代码中的溢出和下溢,因为它可能是一个无声的杀手:您的代码产生不正确的结果但可能不会发出错误信号。

是否可以安全地忽略溢出取决于程序的性质 - 从3D数据中渲染屏幕像素对数值错误的容忍度远高于财务计算。

在默认编译器设置中,通常会关闭溢出检查。为什么?因为在每次操作后检查溢出的附加代码需要时间和空间,这会降低代码的运行时性能。

帮自己一个忙,至少在开启溢出检查的情况下开发和测试你的代码。

答案 6 :(得分:0)

来自wikipedia

  

在计算机编程中,是一个整数   算术时发生溢出   操作尝试创建数字   值大于可以   在可用范围内表示   储存空间。例如,将1添加到可以表示的最大值   构成整数溢出。该   这些案例中最常见的结果是   最不重要的   结果的可表示位   存储(结果称为包装)。

您应该关心它,尤其是在为您的程序选择适当的数据类型时,或者您可能会遇到非常微妙的错误。

答案 7 :(得分:0)

来自http://www.first.org/conference/2006/papers/seacord-robert-slides.pdf

  

整数是整数溢出    增加超过其最大值或    减少超过其最小值。   溢出可以是签名的或未签名的。

P.S。:PDF详细解释了溢出和其他整数错误情况,以及如何解决/避免它们。

答案 8 :(得分:0)

我发现在光盘上显示二进制补码表示非常有帮助。

这里是 4 位整数的表示。最大值为 2^3-1 = 7。

对于 32 位整数,我们将看到最大值为 2^31-1

当我们将2^31-1加1时:顺时针移动一个,显然是-2^31,称为整数溢出

enter image description here

参考:https://courses.cs.washington.edu/courses/cse351/17wi/sections/03/CSE351-S03-2cfp_17wi.pdf

答案 9 :(得分:-1)

当您尝试将整数用于高于整数内部结构的值时,会发生这种情况,因为所使用的字节数。例如,如果最大整数大小为2,147,483,647,并且您尝试存储3,000,000,000,则会出现整数溢出错误。

相关问题