整数溢出包装和计算



我是编程的初学者,我正在学习 C 整数溢出,我发现很难掌握整数溢出输出的概念,我有几个问题:

什么是整数溢出
  • 包装,是否有一个通用的数学过程在整数溢出中也显示一个大数字?

  • 我在维基百科上读到,它说"溢出的最常见结果是存储结果中最不重要的可表示数字;据说结果环绕最大值(即模基的幂,在现代计算机中通常是两个,但有时是十或另一个基数(。" 当算术运算产生的结果大于 N 位整数的最大值时,溢出会将结果降低到模 N 次方 2,仅保留结果的最低有效位并有效地导致环绕。">

我真的完全不明白这里在说什么,"存储结果的最低有效可表示数字"是什么意思和"据说结果环绕最大值(即模基数的幂",最后"溢出将结果减少到 2 的模 n 次方, 只保留最低的有效位",有人可以用例子向我深入解释这一点,我完全不明白这一点。

上次我问一个关于这个问题的问题时,它被关闭为重复项,而所谓的"重复"问题的重复链接根本没有帮助我或回答我的问题,因为它是如此夸张,没有我想要的深入理解。

对于任何正整数 N,当使用直接二进制表示法表示数学整数时,从最后 N 位为零的数字中减去 1 将得到一个最后 N 位均为 1 的数字,在最后一位都是 1 的二进制数上加 1 将得到一个最后 N 位全部为零的数字, 独立于任何高位的值。 此外,对于任何 N,因为数字零的最后 N 位对于任何 N 都是零,所以从零中减去 1 将得到一个最后 N 位都是 1 的数字。 因此,值 -1 实际上是无限个 1 位。

由于使用无限数量的位来保存值 -1 是不切实际的,因此计算机通常使用一种约定,即假定有符号数字中最高有效表示位左侧的所有位都与该位保持相同的值。 这会导致最高有效位的值表现为负数,其大小与无符号值相同。

在像Java这样的语言中,或者在Dennis Ritchie发明的C方言中,涉及有符号整数的计算将被处理,就好像计算了可表示的位一样,然后上位的值通过无限数量的高位"符号扩展"。 由于某些计算机的行为不同,因此该标准允许实现以任意不同的方式运行。 一些"聪明"的实现,如 gcc,将其解释为当整数溢出发生时,即使在整数溢出行为可预测的平台上运行时,也会发出无意义的行为邀请。

相关内容

  • 没有找到相关文章

最新更新