정수 오버플로우
정수 오버플로우는 정수 변수가 표현할 수 있는 범위를 넘어서 값을 저장하려고 할 때 발생하는 현상입니다. 정수 데이터 타입(예: `int`, `long` 등)은 특정 비트 수로 값을 표현하므로, 표현 가능한 최대값을 넘어가면 오버플로우가 발생합니다.
예시
1. `int`의 경우:
int maxValue = Integer.MAX_VALUE; // 2147483647
// 정상적인 범위 내의 덧셈
int sum1 = maxValue + 1; // -2147483648 (Integer.MIN_VALUE)
// 정상적인 범위 내의 뺄셈
int subtract1 = Integer.MIN_VALUE - 1; // 2147483647 (Integer.MAX_VALUE)
2. `long`의 경우:
long maxValue = Long.MAX_VALUE; // 9223372036854775807
// 정상적인 범위 내의 덧셈
long sum2 = maxValue + 1; // -9223372036854775808 (Long.MIN_VALUE)
// 정상적인 범위 내의 뺄셈
long subtract2 = Long.MIN_VALUE - 1; // 9223372036854775807 (Long.MAX_VALUE)
원인
- **비트 수 제한**: 정수 변수는 특정 비트 수로 표현되며, 최대값은 2^(비트 수 - 1) - 1이고, 최소값은 2^(비트 수 - 1)입니다. 이 범위를 넘어가면 오버플로우가 발생합니다.
- **사칙 연산 오버플로우**: 두 정수를 더하거나 빼면서 결과가 표현 가능한 범위를 초과하는 경우에 오버플로우가 발생합니다.
대응 방법
1. **값의 범위 검사**: 연산 전에 변수에 저장된 값이 허용 가능한 범위 내에 있는지 확인합니다.
2. **큰 자료형 사용**: 값의 범위가 넘어갈 것으로 예상되는 경우, 더 큰 자료형(예: `long`, `BigInteger`)을 사용하여 오버플로우를 피할 수 있습니다.
3. **예외 처리**: 프로그램이 오버플로우를 감지하고 처리할 수 있도록 예외 처리를 추가합니다.
int a = Integer.MAX_VALUE;
int b = 1;
try {
int sum = Math.addExact(a, b); // 이 메서드는 오버플로우가 발생하면 ArithmeticException을 던집니다.
System.out.println("Sum: " + sum);
} catch (ArithmeticException e) {
System.out.println("Overflow occurred: " + e.getMessage());
}
예외 처리를 통해 오버플로우를 감지하고 적절한 조치를 취할 수 있습니다.
'코테 > 개념 정리' 카테고리의 다른 글
자료구조 - 해시(Hash)에 관하여... (0) | 2023.12.09 |
---|---|
제곱근과 합성수 간의 관계 (1) | 2023.12.01 |
[Java]. BigInteger클래스 - 매우 큰 정수 표현 (0) | 2023.11.30 |
경우의 수 - 조합(n개의 원소중에서 r개를 선택하여 나열) (0) | 2023.11.30 |
경우의 수 - 순열(n개의 원소에서 r개를 선택하여 나열) (0) | 2023.11.30 |