범위

  • Integer.MAX_VALUE는 \(2^{31} -1 = 2,147,483,647\) 이다.
  • Integer.MIN_VALUE는 \(-2^{31} = -2,147,483,648\) 이다.

음수 부호 적용으로 인한 컴파일 에러

따라서 다음과 같은 컴파일 에러가 가능하다.

/* Java */
// 정상
int a = -2147483648;
long b = -9223372036854775808L;

// compile error
int c = -(2147483648);
long d = -(9223372036854775808L);

overflow

int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;

int c = a + b;  // -2
long d = a + b; // -2
int e = a + 1;  // -2147483648

위 문제를 피하고 싶다면 long으로 계산하거나, Math.addExact를 써서 예외가 던져지게 한다.

int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;

int c = (Math.addExact(a, b));
// java.lang.ArithmeticException: integer overflow

int d = (Math.addExact(a, 1));
// java.lang.ArithmeticException: integer overflow

long도 마찬가지다.

long a = Long.MAX_VALUE;
long b = Long.MAX_VALUE;

long c = a + b;  // -2
long e = a + 1;  // -9223372036854775808
long a = Long.MAX_VALUE;

long f = Math.addExact(a, 1);
// java.lang.ArithmeticException: long overflow

int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;

int c = a * b;  // 1
long d = a * b; // 1
int a = Integer.MIN_VALUE;  // -2147483648
int c = a * -1;             // -2147483648
boolean d = a == c;         // true

위 문제를 피하고 싶다면 long으로 계산하거나, Math.multiplyExact를 써서 예외가 던져지게 한다.

long a = Integer.MAX_VALUE;
long b = Integer.MAX_VALUE;

long c = a * b;  // 4611686014132420609

long d = Integer.MIN_VALUE; // -2147483648
long e = d * -1;            // 2147483648
boolean f = d == e;         // false
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;

int c = Math.multiplyExact(a, b);
// java.lang.ArithmeticException: integer overflow