언어 자료구조 알고리즘/디딤돌 C언어

18. Overflow와 값 잘림 현상

언제나휴일 2016. 1. 1. 11:52
반응형

 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를 대입한 후에 값을 출력하는 코드를 작성하시오.
    그리고 실행한 후 출력 결과의 이유를 설명하시오.



관련 게시글

[정답] 디딤돌 C언어 18. Overflow와 값 잘림 현상

printf 함수 [C언어 표준 라이브러리 함수 가이드]


동영상 강의

[C언어 무료 동영상 강의] 16. char 형식으로 정수 표현, 형변환 17. 정수 형식의 표현범위 18.overflow값 잘림 현상

반응형