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