为什么递增Java int最终会导致负数?

Tea*_*App 3 java

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

码:

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

打印出来的最后一个值是,

2147483337
-2147482958
Run Code Online (Sandbox Code Playgroud)

现在,为什么会出现负面影响?

Ste*_*n C 9

它为什么会消极?

因为当int计算溢出时,这就是Java中指定的内容.

JLS 15.18.2

"如果整数加法溢出,则该结果是因为在一些足够大的二进制补码格式表示的数学总和的低阶位.如果出现溢出,则该结果的符号是不一样的符号两个操作数值的数学和."


(这并没有明确说,溢出总是给人一个负数.而且它不总是这样.但如果你使用的规则,它解释了为什么增加Integer.MAX_VALUE通过+1给你Integer.MIN_VALUE...)

  • @theglauber:我不确定这是多么令人惊讶.为了抛出异常,这意味着每个算术运算都必须伴随检查溢出所花费的额外周期. (4认同)

Edu*_*Ros 5

根据文档:

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

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

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