오버 플로우와 언더 플로우

satic·2025년 3월 18일

오버플로우(Overflow)란?

오버플로우(Overflow)란 데이터가 변수 또는 메모리의 허용 범위를 초과할 때 발생하는 오류를 의미합니다. 이는 컴퓨터가 저장할 수 있는 최대값을 넘거나 최소값을 벗어날 때 발생하며, 예상치 못한 결과를 초래할 수 있습니다.


1. 오버플로우의 종류

오버플로우는 주로 다음과 같이 두 가지 유형으로 나뉩니다.

① 정수 오버플로우(Integer Overflow)

  • 정수형 변수에서 최대값을 초과하면 최소값으로 순환하는 현상입니다.
  • C, C++, Java 등에서 발생하며, 예측 불가능한 값을 초래할 수 있습니다.

예제 (C)

#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)으로 순환됩니다.


② 부동소수점 오버플로우(Floating Point Overflow)

  • 부동소수점(실수형)이 표현할 수 있는 최대값을 초과하면 Infinity(∞)로 처리됩니다.

예제 (C)

#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(무한대)로 변합니다.


2. 언더플로우(Underflow)란?

오버플로우의 반대 개념으로, 변수가 표현할 수 있는 최소값보다 더 작은 값을 저장하려 할 때 발생하는 현상입니다.

언더플로우 예제 (C)

#include <stdio.h>
#include <float.h>

int main() {
    float num = FLT_MIN / 100.0f; // 매우 작은 값
    printf("언더플로우 발생 후: %e\n", num);
    return 0;
}

출력 결과

언더플로우 발생 후: 0.000000e+00

설명: 너무 작은 값은 0으로 처리됩니다.


3. 오버플로우 방지 방법

① 정수 오버플로우 방지

  • 값을 미리 체크하여 오버플로우가 발생하지 않도록 방지합니다.
if (num > INT_MAX - 10) { 
    printf("오버플로우 방지됨!\n"); 
} else { 
    num += 10;
}

② 부동소수점 오버플로우 방지

  • 수의 범위를 벗어나지 않도록 제한된 크기의 연산을 수행합니다.
if (num < FLT_MAX / 10) {
    num *= 10;
} else {
    printf("오버플로우 방지됨!\n");
}

4. 오버플로우의 실제 사례

① 비트 연산에서의 오버플로우

  • 일부 프로그래밍 언어에서 비트 연산 시 오버플로우가 발생할 수 있습니다.
unsigned char x = 255; // 8비트 최대값
x = x + 1; // 오버플로우 발생 → 0이 됨
printf("%d\n", x);

설명: 255 + 10이 됩니다. (8비트에서는 256을 표현할 수 없기 때문)

② 비밀번호 해킹 방어 (Integer Overflow)

  • 많은 시스템에서 입력값 검증을 하지 않으면, 오버플로우를 이용한 해킹 공격이 가능합니다.
  • 예를 들어, 배열 크기를 초과하는 연산을 수행하면 버퍼 오버플로우(BUFFER OVERFLOW)가 발생할 수 있습니다.
char password[10]; // 10글자 제한
gets(password); // 입력 길이 검증 없음 → 버퍼 오버플로우 발생 가능

해결 방법: fgets() 또는 입력 크기 제한을 적용해야 함.


5. 결론

  • 오버플로우는 프로그램의 안정성을 해칠 수 있으므로 방지하는 것이 중요합니다.
  • 사전 체크데이터 타입 선택을 통해 문제를 예방할 수 있습니다.

profile
95.06.09

0개의 댓글