7.7 연습문제: 정수형 변수 선언과 오버플로우

다음 소스 코드를 완성하여 0 0 -9223372036854775808이 출력되게 만드세요.

practice_integer_overflow.c

#include <stdio.h>

int main()
{
    ________________ num1 = 256;
    ________________ num2 = 65536;
    ________________ num3 = 9223372036854775808;

    printf("%u %u %lld\n", num1, num2, num3);

    return 0;
}

실행 결과

0 0 -9223372036854775808

정답

 unsigned char
 unsigned short
 long long

해설

변수 num1, num2, num3에 저장한 값과 실제 출력 결과가 다릅니다. 여기서 저장한 숫자를 잘 보면 익숙한 숫자들입니다.

  • 256: unsigned char의 최댓값인 255보다 1이 큰 숫자
  • 65536: unsigned short의 최댓값인 65,535보다 1이 큰 숫자
  • 9223372036854775808: long long의 최댓값인 9,223,372,036,854,775,807보다 1이 큰 숫자

이 값들을 출력했을 때 0 0 -9223372036854775808이 나왔다면 정수 오버플로우가 발생한 상황입니다. 따라서 256일 때 0이 나오려면 unsigned char, 65536일 때 0이 나오려면 unsigned short, 9223372036854775808일 때 -9223372036854775808이 나오려면 long long이라야 합니다.