4

我试图检查不同的输入并在java中创建无限循环,我发现一旦int超过最大限制它就会变成负数-2147482958。我只是在无限循环中增加 int ......

代码:

public static void infiniteLoop(){
        for(int i=0;i>-1;i++){
            i = i + 1000;
            System.out.println(i);
        }
    }

最后一个 to 值被打印出来是,

2147483337
-2147482958

现在,为什么它会变成负数?

4

4 回答 4

10

为什么会变成负数?

因为这是在 Java 中指定在int计算溢出时发生的事情。

JLS 15.18.2

“如果整数加法溢出,则结果是数学和的低位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的数学和。”


(这并没有明确说溢出总是给出一个负数。它并不总是。但是如果你应用这个规则,它确实解释了为什么递增Integer.MAX_VALUE+1Integer.MIN_VALUE......)

于 2012-06-10T12:35:20.353 回答
5

根据文档:

int 数据类型是一个 32 位有符号二进制补码整数。它的最小值为 -2,147,483,648 (0x80000000),最大值为 2,147,483,647 (0x7FFFFFFF)(含)

因此,当您将整数的最大值加一时:

0x7FFFFFFF + 0x00000001 = 0x80000000 (-2,147,483,648)

于 2012-06-10T12:48:12.447 回答
3

因为当 int 的值达到Integer.MAX_VALUE时,增加它会导致溢出并因此环绕到Integer.MIN_VALUE

要使用更大的整数,请使用具有64 位的long代替。

于 2012-06-10T12:37:28.603 回答
1

因为int范围从 -2,147,483,648 到 2,147,483,647。因此,一旦达到上限,它就会溢出并从负数开始。

请参阅文档

int 数据类型是一个 32 位有符号二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647(含)

于 2012-06-10T12:36:36.850 回答