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이 나옵니다. 마찬가지로 num2도 unsigned char에 저장할 수 있는 최댓값은 255인데 256을 넣으면 범위를 넘어서므로 최솟값인 0부터 다시 시작하게 됩니다.
char 이외에도 short, int, long, long long 등도 저장할 수 있는 범위를 넘어서면 최솟값부터 다시 시작하게 됩니다. 반대로 최솟값보다 작아지면 언더플로우(underflow)가 발생하여 최댓값부터 다시 시작하게 됩니다(값을 계속 뺀다면 최댓값에서 값이 계속 작아짐).