什么是整数溢出错误? 为什么我关心这样的错误? 有哪些避免或预防方法?
答案 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,称为整数溢出
参考: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,则会出现整数溢出错误。