【问题标题】:Integer overflow wrapping and calculation整数溢出包装和计算
【发布时间】:2020-10-24 22:17:25
【问题描述】:
我是编程初学者,正在学习 C 整数溢出,我发现很难掌握整数溢出输出的概念,我有几个问题:
-
什么是整数溢出的包装,是否有一个通用的数学过程也可以在整数溢出中显示一个大数字?
-
我在 Wikipedia 上阅读,它说 “溢出的最常见结果是存储结果的最低有效可表示数字;据说结果环绕最大值(即模基数,在现代计算机中通常是两个,但有时是十个或另一个基数)。" 和 " 当算术运算产生的结果大于上述 N 位整数的最大值时,溢出会减少结果以 2 的 N 次方为模,仅保留结果的最低有效位并有效地导致回绕。”
我根本不明白这里在说什么,“存储结果的最低有效可表示数字”是什么意思,“据说结果环绕最大值(即模数基数”,最后是什么意思“溢出将结果减少到2的模n次方,只保留最低有效位”,有人可以用例子向我详细解释一下吗?我根本不明白.
上次我问这个问题时,它作为重复而被关闭,并且指向所谓的“重复”问题的重复链接根本没有帮助我或回答我的问题,因为它是如此模糊且不深入正如我希望我的理解那样。
【问题讨论】:
标签:
integer
integer-overflow
【解决方案1】:
对于任何正整数 N,当使用直接二进制表示法表示数学整数时,从最后 N 位为零的数中减去 1 将得到最后 N 位全为 1 的数,并将其加一到二进制数最后一位全为 1 将产生一个最后 N 位全为零的数字,与任何高位的值无关。此外,对于任何 N,因为数字 0 的最后 N 位对于任何 N 都将为零,所以从零中减去 1 将产生最后 N 位全为 1 的数字。因此,值 -1 实际上是无限数量的1 位。
由于使用无限位数来保存值 -1 是不切实际的,因此计算机通常使用一种约定,即假定有符号数中最高有效位左侧的所有位都保存相同的值作为那个位。这会导致最高有效位的值表现为负数,其大小与无符号值相同。
在像 Java 这样的语言中,或者在 Dennis Ritchie 发明的 C 方言中,涉及有符号整数的计算将像计算可表示的位一样被处理,然后高位的值通过一个“符号扩展”无限个高位。由于某些计算机的行为不同,该标准允许实现以任意不同的方式运行。一些“聪明”的实现(如 gcc)将此解释为在整数溢出发生时进行无意义行为的邀请,即使在整数溢出行为可预测的平台上运行也是如此。