C++에서 정수 오버플로를 감지하는 방법
가장 안전하고 확실한 방법은 오버플로가 발생하기 전에 미리 검사하는 것입니다. 다만, 이미 발생한 오버플로를 확인할 수 있는 몇 가지 트릭적인 방법들도 존재합니다.
부호 없는 정수 덧셈에서의 오버플로 감지
부호 없는 정수(unsigned int)의 덧셈에서 오버플로를 감지하려면, 연산 결과가 입력값 중 하나보다 실제로 작은지 확인하면 됩니다. 예시는 다음과 같습니다.
unsigned int x, y;
unsigned int value = x + y;
bool overflow = value < x; // "value < y"로 검사해도 동일하게 동작합니다
이 방식이 작동하는 원리는 간단합니다. x와 y가 모두 부호 없는 정수일 때, 두 값을 더한 결과가 오버플로되면 값이 최대 범위를 넘어 다시 처음부터 순환(wrap around)하게 됩니다. 이때 결과값은 x나 y보다 클 수 없습니다. 만약 결과가 x 또는 y보다 커지려면, 부호 없는 정수가 표현할 수 있는 최댓값보다 더 큰 값이 되어야만 하기 때문입니다.
CPU의 오버플로 플래그 활용하기
또 다른 방법은 CPU가 제공하는 오버플로(Overflow) 플래그에 직접 접근하는 것입니다. 일부 컴파일러는 이 플래그에 접근할 수 있는 기능을 제공하며, 이를 통해 오버플로 여부를 테스트할 수 있습니다. 하지만 이 방법은 표준이 아니므로 특정 플랫폼이나 컴파일러에 종속된다는 한계가 있습니다.
기타 방법들
이 외에도 오버플로를 감지하는 여러 가지 기법들이 있지만, 대부분 정확한 판별이 아닌 근사적인 추정치만을 제공한다는 점에 유의해야 합니다. 보다 다양한 접근 방식이 궁금하다면 Stack Overflow의 관련 답변(https://stackoverflow.com/a/199455/3719089)을 참고하는 것을 추천합니다.