다음 소스 코드를 완성하여 0 0 -128이 출력되게 만드세요.
표준 출력
0 0 -128
judge_integer_overflow.c
#include <stdio.h>
int main()
{
__________________
__________________
__________________
num1 = 65536;
num2 = 4294967296;
num3 = 128;
printf("%u %u %d\n", num1, num2, num3);
return 0;
}
정답
unsigned short int num1;
unsigned long int num2;
char num3;
풀이
num1과 num2에 값을 할당할 때 분명 0이 아닌 수로 할당했는데, 출력에 0으로 나왔다. 아! 이것은 오버플로우구나!
그렇다. 근데 음수가 아닌 0으로 나왔다는 것은 unsigned형 변수이다. 그러면 이제 할당한 숫자로 short int인지,
int인지, long int인지를 판별해야 하는데 unsigned short int가 2바이트, 16비트이므로 2의 16 제곱 값만큼 표현할 수 있다.
따라서, unsigned short int의 범위는 0~65,535이고, num1에 65,536을 할당했는데 출력이 0이므로 num1은 unsigned short int이다. (int는 생략해도 상관없다)
다음, num2에 4294967296을 할당했을 때 0, 즉 2의 32제곱의 출력 값이 0이면 32비트 4바이트 정수 자료형이고
이에 해당하는 정수 자료형은 unsigned int, unsigned long, unsigned long int(short처럼 int는 생략해도 상관없다)가 있다.
마지막으로 128을 할당했는데 -128이 됐다. 이것은 unsigned형 변수가 아니다. 게다가 범위가 -128~127이니깐,
256은 2의 8 제곱이므로 8비트 1바이트. 이에 해당하는 정수 자료형은 char이다.
'C' 카테고리의 다른 글
[C] C언어 코딩 도장 7.13 심사문제: 최솟값 표현하기 (0) | 2022.04.25 |
---|---|
[C] C언어 코딩 도장 7.12 심사문제: 자료형 크기 구하기 (0) | 2022.04.25 |
[C] C언어 코딩 도장 5.6 심사문제: 변수를 선언하고 값 할당하기 (0) | 2022.04.25 |
[C] C언어 코딩 도장 3.10 심사문제: 서식 지정자 사용하기 (0) | 2022.04.25 |
[C] C언어 코딩 도장 3.9 심사문제: 문자열 출력하기 (0) | 2022.04.25 |