오버플로우(Overflow)란 데이터가 변수 또는 메모리의 허용 범위를 초과할 때 발생하는 오류를 의미합니다. 이는 컴퓨터가 저장할 수 있는 최대값을 넘거나 최소값을 벗어날 때 발생하며, 예상치 못한 결과를 초래할 수 있습니다.
오버플로우는 주로 다음과 같이 두 가지 유형으로 나뉩니다.
#include <stdio.h>
#include <limits.h> // INT_MAX, INT_MIN 포함
int main() {
int num = INT_MAX; // 정수형 최대값
printf("최대값: %d\n", num);
num = num + 1; // 오버플로우 발생
printf("오버플로우 발생 후: %d\n", num);
return 0;
}
최대값: 2147483647
오버플로우 발생 후: -2147483648
설명:
INT_MAX(2147483647)에 1을 더하면, 값이 최소값(-2147483648)으로 순환됩니다.
#include <stdio.h>
#include <float.h> // 실수형 최대값
int main() {
float num = FLT_MAX; // float 최대값
printf("최대값: %e\n", num);
num = num * 100.0f; // 오버플로우 발생
printf("오버플로우 발생 후: %e\n", num);
return 0;
}
최대값: 3.402823e+38
오버플로우 발생 후: inf
설명:
FLT_MAX값이100배 증가하면, Infinity(무한대)로 변합니다.
오버플로우의 반대 개념으로, 변수가 표현할 수 있는 최소값보다 더 작은 값을 저장하려 할 때 발생하는 현상입니다.
#include <stdio.h>
#include <float.h>
int main() {
float num = FLT_MIN / 100.0f; // 매우 작은 값
printf("언더플로우 발생 후: %e\n", num);
return 0;
}
언더플로우 발생 후: 0.000000e+00
설명: 너무 작은 값은 0으로 처리됩니다.
if (num > INT_MAX - 10) {
printf("오버플로우 방지됨!\n");
} else {
num += 10;
}
if (num < FLT_MAX / 10) {
num *= 10;
} else {
printf("오버플로우 방지됨!\n");
}
unsigned char x = 255; // 8비트 최대값
x = x + 1; // 오버플로우 발생 → 0이 됨
printf("%d\n", x);
설명:
255 + 1은0이 됩니다. (8비트에서는 256을 표현할 수 없기 때문)
char password[10]; // 10글자 제한
gets(password); // 입력 길이 검증 없음 → 버퍼 오버플로우 발생 가능
해결 방법:
fgets()또는 입력 크기 제한을 적용해야 함.