Java 将1添加到循环中的Integer.MAX_值会导致意外行为(而不是添加到Integer.MIN_值的行为)

Java 将1添加到循环中的Integer.MAX_值会导致意外行为(而不是添加到Integer.MIN_值的行为),java,loops,integer,integer-overflow,primitive-types,Java,Loops,Integer,Integer Overflow,Primitive Types,我当时正在为“数组操作”进行HackerRank挑战,遇到了一个意想不到的有趣问题。我正在运行一个大的for循环,在这里我在添加前缀和,当我在前缀和中传递Integer.MAX_值时(其中和存储为int),数字会下降几千,而不是循环到负值,这是我的预期行为 有人知道为什么会这样吗?如果将前缀和存储为long,则没有问题 import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; pub

我当时正在为“数组操作”进行HackerRank挑战,遇到了一个意想不到的有趣问题。我正在运行一个大的for循环,在这里我在添加前缀和,当我在前缀和中传递Integer.MAX_值时(其中和存储为
int
),数字会下降几千,而不是循环到负值,这是我的预期行为

有人知道为什么会这样吗?如果将前缀和存储为
long
,则没有问题

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ArrayManipulation {
   public static long arrayManipulationPrefixSumLong(int n, int[][] queries) {
        long[] array = new long[n];
        for (int i = 0; i < queries.length; i++) {
            int lowIndex = queries[i][0] - 1;
            int highIndex = queries[i][1] - 1;
            int addend = queries[i][2];

            array[lowIndex] += addend;
            if (highIndex + 1 < n)
                array[highIndex + 1] -= addend;
        }

        long maxInt = 0;
        for (int i = 0; i < array.length; i++) {
            if (i != 0)
                array[i] = array[i - 1] + array[i];
            if (array[i] > maxInt)
                maxInt = array[i];
        }
        return maxInt;
    }

    public static int arrayManipulationPrefixSumInt(int n, int[][] queries) {
        int[] array = new int[n];
        for (int i = 0; i < queries.length; i++) {
            int lowIndex = queries[i][0] - 1;
            int highIndex = queries[i][1] - 1;
            int addend = queries[i][2];

            array[lowIndex] += addend;
            if (highIndex + 1 < n)
                array[highIndex + 1] -= addend;
        }

        int maxInt = 0;
        for (int i = 0; i < array.length; i++) {
            if (i != 0)
                array[i] = array[i - 1] + array[i];
            if (array[i] > maxInt)
                maxInt = array[i];
        }
        return maxInt;
    }

    public static void main(String[] args) {
        Scanner scanner = null;
        try {
            scanner = new Scanner(new File("input10ArrayManipulation_Subset85545.txt"));
//            scanner = new Scanner(new File("input10ArrayManipulation.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        int n = scanner.nextInt();
//        System.out.println(n);
        int qn = scanner.nextInt();
//        System.out.println(qn);
        int[][] queries = new int[qn][3];
        for (int i = 0; i < qn; i++) {
            queries[i] = new int[]{scanner.nextInt(), scanner.nextInt(), scanner.nextInt()};
        }

        scanner.close();
        System.out.println(new String(new char[85]).replace("\0", "*"));
        System.out.println("Trying to find why exceeding Integer.MAX_VALUE in a loop causes unexpected behaviour.");
        System.out.println(new String(new char[60]).replace("\0", "-"));


        //Relevant part
        long arrayManipulationPrefixSumLong = arrayManipulationPrefixSumLong(n, queries);
        int arrayManipulationPrefixSumInt = arrayManipulationPrefixSumInt(n, queries);

        //Notice these two give different values
        System.out.println("The long version: " + arrayManipulationPrefixSumLong);
        System.out.println("The int version: " + arrayManipulationPrefixSumInt);

        // Adding past the max value in a loop doesn't result in a negative number,
        // to see this behaviour, increment the last line of input10ArrayManipulation_Subset85545 by 1.
        System.out.println(Integer.MAX_VALUE - arrayManipulationPrefixSumLong);
        //The below is my expected behaviour, where integer overflow occurs.
        System.out.println("Max integer is: " + Integer.MAX_VALUE + " | Max integer +1 is: " + (Integer.MAX_VALUE + 1));

        System.out.println(new String(new char[60]).replace("\0", "-"));
        System.out.println("Now testing with the other file that has 1 incremented on the last line, which makes it exceed the Integer.MAX_VALUE");
        try {
            scanner = new Scanner(new File("input10ArrayManipulation_Subset85545_increment1.txt"));
            n = scanner.nextInt();
//        System.out.println(n);
            qn = scanner.nextInt();
//        System.out.println(qn);
            queries = new int[qn][3];
            for (int i = 0; i < qn; i++) {
                queries[i] = new int[]{scanner.nextInt(), scanner.nextInt(), scanner.nextInt()};
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        arrayManipulationPrefixSumLong = arrayManipulationPrefixSumLong(n, queries);
        arrayManipulationPrefixSumInt = arrayManipulationPrefixSumInt(n, queries);

        //Notice these two give different values
        System.out.println("The long version: " + arrayManipulationPrefixSumLong);
        System.out.println("The int version: " + arrayManipulationPrefixSumInt);

        scanner.close();
    }
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公共类数组操作{
公共静态long arrayManipulationPrefixSumLong(int n,int[][]查询){
long[]数组=新的long[n];
for(int i=0;imaxInt)
maxInt=数组[i];
}
返回maxInt;
}
公共静态int-ArrayManipulationPrefixSamint(int-n,int[][]查询){
int[]数组=新的int[n];
for(int i=0;imaxInt)
maxInt=数组[i];
}
返回maxInt;
}
公共静态void main(字符串[]args){
扫描器=空;
试一试{
扫描仪=新扫描仪(新文件(“input10ArrayManipulation_Subset85545.txt”);
//扫描仪=新扫描仪(新文件(“input10ArrayManipulation.txt”);
}catch(filenotfounde异常){
e、 printStackTrace();
}
int n=scanner.nextInt();
//系统输出println(n);
int qn=scanner.nextInt();
//系统输出打印LN(qn);
int[][]查询=新int[qn][3];
对于(int i=0;i
用于测试此程序的文本文件可在以下位置找到: