18. OVERFLOW와 값 잘림 현상

만약 정수 형식에서 표현할 수 있는 범위를 벗어나는 연산을 수행하면 어떻게 될까요?

표현 범위를 벗어날 때 처리하는 방식은 프로그래밍 언어마다 달라요.
C언어에서는 표현 범위를 벗어나도 프로그램은 예외를 발생하지 않고 동작해요.
물론 연산 결과는 개발자가 원하는 결과가 아닌 엉뚱한 값이 되겠죠.
이처럼 연산 결과가 표현 범위의 벗어나는 것을 오버플로우(overflow)라고 불러요.
좀 더 세분화하면 최대값을 넘어서는 것을 오버플로우, 최소값보다 작아지는 것을 언더플로우(underflow)라고 부르죠.

예를 들어 char 형식 변수 c1에 127(16진수 0x7F)로 설정한 후에 1을 더하면 오버플로우가 발생해요.
이 때 연산 결과는 -128(16진수 0x80)이예요.
물론 c1의 값이 -128(16진수 0x80)일 때 1을 빼면 127(16진수 0x7F)이구요.

◈ 오버플로우와 언더플로우

#include <stdio.h>
int main()
{
    char c = 127;        //char 형식 변수 c를 선언하고 127(0x7F)로 초기화
    c = c+1;
    printf("c: %d \n",c); //변수 c의 값 출력
    c = c-1;
    printf("c:%d \n",c);  //변수 c의 값 출력
    return 0;
}

◈ 실행 결과

c: -128 
c:127

C언어에서는 표현 범위가 다른 정수 형식 사이에 묵시적 형변환을 제공하죠.
표현 범위가 좁은 형식 변수를 넓은 형식 변수에 대입하는 것은 아무런 문제도 발생하지 않아요.
그런데 표현 범위가 넓은 형식 변수를 좁은 형식 변수에 대입할 때는 주의하세요.
예를 들어 int 형식 변수 i에 0x1234 값이 있을 때 char 형식 변수 c에 대입하면 하위 1바이트의 값인 0x34만 남아요.
이러한 현상을 값 잘림 현상이라고 불러요.

◈ 정수 값 잘림 현상

#include <stdio.h>
int main()
{
    int i = 0x1234;
    char c=0;
 
    c = i;
    printf("c:%#x i:%#x \n",c,i); //16진수로 출력
    return 0;
}

◈ 실행 결과

c:0x34 i:0x1234

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

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