[정답] 18. OVERFLOW와 값 잘림 현상

◈ 기본 연습
1. short 형식의 변수 s를 0x7FFF 값으로 초기화한 후 s 변수에 1을 더하면 10진수로 얼마인지 확인하는 코드를 작성하시오.
그리고 실행한 후 출력 결과의 이유를 설명하시오.
답:

//1. short 형식의 변수 s를 0x7FFF 값으로 초기화
//s 변수에 1을 더하면 10진수로 얼마인지 확인하는 코드를 작성하시오.
//그리고 실행한 후 출력 결과의 이유를 설명하시오.
 
#include <stdio.h>
int main(void)
{
    short s = 0x7FFF;
 
    printf("short s: %d\n",s);
    s+=1;
    printf("short s: %d\n",s);
    
    return 0;
}
 

▷ 실행 결과

short s: 32767
short s: -32768

▷ 이유
short  형식의 크기는 2바이트이며 부호있는 정수를 표현하는 형식입니다.
0x7FFF는 이진수로 0111 1111 1111 1111 이며 short로 표현할 수 있는 가장 큰 정수입니다.
여기에 1을 더하면 이진수로 1000 0000 0000 0000 이며 short로 표현할 수 있는 가장 작은 정수입니다.
이러한 현상을 overflow라고 부릅니다.

2. int 형식 변수 i를 128 값으로 초기화한 후 char 형식 변수 c에 i를 대입한 후에 값을 출력하는 코드를 작성하시오.
그리고 실행한 후 출력 결과의 이유를 설명하시오.
답:

//2. int 형식 변수 i를 128 값으로 초기화한 후 
// char 형식 변수 c에 i를 대입한 후에 값을 출력하는 코드를 작성하시오. 
// 그리고 실행한 후 출력 결과의 이유를 설명하시오.

#include <stdio.h>
int main(void)
{
    int i = 128;
    char c;
    c = i;

    printf("c: %d\n",c);
    return 0;
}

▷ 실행 결과

-128

▷ 이유
int 형식 128은 이진수로 0000 0000 0000 0000 0000 0000 1000 0000 입니다.
char 형식의 크기는 1바이트입니다.
char 형식 변수에 int 형식을 대입하면 하위 1바이트를 제외한 나머지는 값이 잘립니다.
따라서 대입 연산으로 c 의 메모리에는 1000 0000 을 설정합니다.
2진 보수 방식에서 1000 0000은 -128입니다.