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이라야 합니다.