7.2 오버플로우와 언더플로우 알아보기

만약 정수 자료형에서 저장할 수 있는 범위를 넘어서면 어떻게 될까요? 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

integer_overflow.c

#include <stdio.h>

int main()
{
    char num1 = 128;             // char에 저장할 수 있는 최댓값 127보다 큰 수를 할당
                                 // 오버플로우 발생

    unsigned char num2 = 256;    // unsigned char에 저장할 수 있는 최댓값 255보다 큰 수를 할당
                                 // 오버플로우 발생

    printf("%d %u\n", num1, num2);    // -128 0: 저장할 수 있는 범위를 넘어서므로 
                                      // 최솟값부터 다시 시작

    return 0;
}

실행 결과

-128 0

num1에 128을 넣었는데 실제 출력에서는 -128이 나와버렸습니다. char에 저장할 수 있는 최댓값은 127이라서 오버플로우(overflow)가 발생했기 때문입니다. 즉, 128이 127보다 1이 많아서 저장할 수 있는 범위를 넘어섰고 다시 최솟값부터 시작하게 되므로 -128이 나옵니다. 마찬가지로 num2unsigned char에 저장할 수 있는 최댓값은 255인데 256을 넣으면 범위를 넘어서므로 최솟값인 0부터 다시 시작하게 됩니다.

char 이외에도 short, int, long, long long 등도 저장할 수 있는 범위를 넘어서면 최솟값부터 다시 시작하게 됩니다. 반대로 최솟값보다 작아지면 언더플로우(underflow)가 발생하여 최댓값부터 다시 시작하게 됩니다(값을 계속 뺀다면 최댓값에서 값이 계속 작아짐).

그림 7‑2 정수의 오버플로우와 언더플로우