【问题标题】:What happens when you perform ++ operation on an integer with it's max possible value?当您对具有最大可能值的整数执行 ++ 操作时会发生什么?
【发布时间】:2013-06-03 13:11:09
【问题描述】:

所以,这是一个经典,但我在任何地方都找不到决定性的答案。
假设我有一个整数“x”。我正在循环执行“++”操作。 像这样的:

int x=0;
while(true){
    x++;
    print(x);
} 

我想输出会从某个最大值旋转到某个最小值,但是这些值是什么?
它还取决于使用的编程语言吗?

【问题讨论】:

  • 我能理解的是这个。如果 lang 使用 32 位,对于有符号的值将从 (- 2^31) 旋转到 (+ 2^31 -1),对于无符号的值将从 0 旋转到 (2^32 -1)。我在这里完全准确吗?
  • 这听起来像是一个合理的假设。顺便说一句,您的编译器可能比我们知道的更多。将 x 设置为 2^31 -2,看看当您递增两次时会发生什么。

标签: integer integer-overflow


【解决方案1】:

比较原始数据类型及其默认值/最大值/最小值的几个参考:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://www.cplusplus.com/reference/climits/

【讨论】:

    【解决方案2】:

    这在很大程度上取决于语言,以及该语言是如何实现的,以及接下来会发生什么。

    最大值和最小值还取决于数据类型(在这种情况下为 int)是有符号还是无符号(即它可以是负数吗?),以及用于实现它的位数(16-位整数不会像 64 位整数那么大)。您的语言可能会或可能不会指定整数位数。

    如果您使用 C,您可以#include <limits.h> 访问 INT_MAX 宏,它会告诉您在编译器下 int 可以在您的系统上保存的最大数字。 INT_MIN 相应地为您提供最小值。

    【讨论】:

    • 我能理解的是这个。如果 lang 使用 32 位,对于有符号的值将从 (- 2^31) 旋转到 (+ 2^31 -1),对于无符号的值将从 0 旋转到 (2^32 -1)。我在这里完全准确吗?
    • 是的,没错,原因是我们用最高位来表示符号,有效地缩小了可表示值的范围。有效地将 32 位有符号数设为 31 位范围
    【解决方案3】:

    是的,例如在 java 中 integer.MAX_VALUE + 1 最终是 integer.MIN_VALUE,也是 integer.MIN_VALUE - 1 = integer.MAX_VALUE。我不确定所有语言如何处理这个问题,但有一个例子供你参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-19
      • 2018-07-15
      • 1970-01-01
      • 2011-07-05
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多