跳转到内容

编程基础/整数溢出

来自维基教科书,开放的书籍,开放的世界

当算术运算试图创建一个超出给定位数所能表示的范围的数值时,就会发生整数溢出 - 要么大于最大值,要么小于最小可表示值。[1]

溢出最常见的结果是存储结果的最低有效位;结果被认为环绕最大值(即模二的幂)。溢出条件可能给出导致意外行为的结果。特别是,如果未预料到这种可能性,溢出可能会损害程序的可靠性和安全性。[2]

有时字符和整数数据类型被归为一类,因为它们的行为都相同(通常称为整数族)。更确切地说,它们的行为不同于浮点数据类型。整数族的值从一个值跳到另一个值。6 和 7 之间,以及 ‘A’ 和 ‘B’ 之间什么都没有。可能会问为什么不将所有数字都设置为浮点数据类型?原因有两点。首先,现实世界中有些东西不是分数。一只狗,即使只有 3 条腿,也仍然是一条狗,而不是四分之三条狗。其次,整数数据类型通常用于通过计数(计数循环)来控制程序流程。整数族具有循环环绕特性。使用一个两字节整数,大于 32767 的下一个数字是负 32768(字符的行为方式相同,从 255 到 0。我们也可以反过来,使负 32768 的下一个较小数字是正 32767。这可以通过使用一条正常的数学线,限制域,然后连接两端形成一个圆圈来显示。

这种整数族的循环性质适用于整数和字符数据类型。从理论上讲,它也应该适用于布尔数据类型;但在大多数编程语言中,由于各种技术原因,它不适用于布尔数据类型。

“在数学中,模算术(有时称为时钟算术)是一种针对整数的算术系统,其中数字在达到某个值(模数)后“环绕”。…

模算术的一个常见应用是它在 12 小时制时钟中的使用,即将一天分为两个 12 小时的时间段。如果现在是 7:00,那么 8 小时后将是 3:00。常规加法会建议较晚的时间应该是 7 + 8 = 15,但这并非正确答案,因为时钟时间每 12 小时“环绕”一次;没有“15 点”。同样,如果时钟从 12:00(中午)开始,经过 21 小时,则时间将是第二天 9:00,而不是 33:00。由于小时数在达到 12 时会重新开始,因此这是模 12 算术。

时钟上的时间记录提供了模算术的示例。”(维基百科的模算术)

模运算符在整数除法中的使用与模算术中使用的概念有关。

执行循环时的影响

[编辑 | 编辑源代码]

如果程序员错误地设置了计数循环,通常会发生以下三种情况之一

  • 无限循环 - 通常由缺少更新属性引起。
  • 循环从未执行 - 通常,文本表达式是错误的,小于或大于关系的方向需要切换。
  • 循环执行的次数超过预期 - 更新处理不当。通常,计数方向(递增或递减)需要切换。

让我们举一个循环执行看似无限次(我们列表中的第三项)的例子。

for int x = 0, x < 10, x--
    Output x

上面的代码意外地递减,x 的值以负数的方式朝 -2147483648(普通四字节有符号整数数据类型中最大的负值)移动。它可能需要一段时间(因此可能看起来是无限循环)才能达到负 20 亿多的值,然后最终递减到正 2147483647。这会间接停止循环执行。

关键词

[编辑 | 编辑源代码]
循环性质
连接整数族数据类型域的负数和正数端。
循环控制
确保循环的属性得到妥善处理。
模算术
一种针对整数的算术系统,其中数字“环绕”。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书