C 언어 - 오버플로우와 언더플로우

컴퓨터/C

728x90
반응형

메모리공간의 할당을 넘어선 값

메모리공간을 1Byte 사용하여 변수를 할당하면 2^8 즉 256개의 표현이 가능합니다.

그렇다면 사용자가 어떠한 프로그래밍 언어를 통해서 할당된 변수의 메모리공간을 초과하는 데이터를 입력하면 어떻게 될까요? 이렇게 메모리 공간을 초과한 데이터가 들어왔을때 생기는 현상을 오버플로우,언더플로우라고 말합니다.

 

오버플로우(OverFlow)

변수가 표현할수 있는 최대의 범위를 넘어가는 경우를 변수의 오버플로우 현상이라고 말합니다. 

C언어의 자료형 char의 경우 -128~127의 범위를 가지고 있습니다.  이때에 프로그래밍에서 char형 자료형을 가진 변수가 127 이상의 값이 들어가려고 하면 오버플로우 현상이 생기는 것 입니다. 메모리 구조를 보면서 한번 알아보도록 하겠습니다.

 

C언어에서 char형 자료형의 경우 1개으 부호비트와 7개의 데이터의 영역을 가지고 있습니다. 그래서 양수 127까지 표현을 할수 있는 것 입니다. 그렇담면 양수 127을 메모리상의 이진수의 형태로 보면 그림과 같이 01111111이 됩니다. 여기서 +1을 한다면 7bit영역이 아닌 부호비트가 바뀌며 10000000이 되버립니다. 

이런식으로 사용자가 선택한 자료형의 메모리 공간의 표현을 넘어가는 경우를 오버플로우라고 합니다.

 

참고 실습 코드 (C언어)

#include <stdio.h>

int main()
{
	char a;
	a = 127;
	printf("%d\n", a);
	a = 128;
	printf("%d\n", a);
	return 0;
}

언더플로우(UnderFlow)

이제 최소 값의 표현을 넘어갈때를 알아봐야 보도록 하겠습니다. 이런 경우를 언더플로우로 하며 어떻게 바뀌는지 한번 보도록 하겠습니다.

 

오버플로우와 마찬가지로 부호비트가 영향을 받아 값이 바뀌는 것을 알수 있습니다 이렇게 최소의 값을 넘어섰을때를 언더 플로우라고 합니다.

참고 실습 코드 (C언어)

#include <stdio.h>

int main()
{
	char a;
	a = -128;
	printf("%d\n", a);
	a = -129;
	printf("%d\n", a);
	return 0;
}

추가 부호 비트가 없을때 언더플로우나 오버플로우가 생긴다면 ?

만약 부호비트가 없는 unsigned char 형 자료형으 값이 최대범위라면 메모리공간에서는 아래와 같을 겁니다.

이런 경우 메모리에서 어떻게 될까요 ?  쉽게 계산을 해본다면 9bit의 공간에 1 0000 0000이 됩니다. 하짐만 사용자가 선언한 메모리공간은 1Byte(8bit)의 공간입니다. 그래서 값의 짤림 현상이 발생하게 되어 1byte공간 외의 값은 취하지 않아 다음과 같은 결과가 나옵니다.

참고 실습 코드 (C언어)

#include <stdio.h>

int main()
{
	unsigned char a;
	a = 255;
	printf("%d\n", a);
	a = 256;
	printf("%d\n", a);
	return 0;
}

오버플로우 / 언더플로우의 개념의 필요 이유

이런 오버플로우와 언더플로우의 개념을 활용하여 편법(?)을 사용할 수도 있지만 근복적으로 이런 현상이 발생하는 것을 지양해야만 좋은 프로그래머라고 할수 있을 겁니다. 

정말 완벽한 프로그래머고 실수가 없다면 위의 개념을 경험하지도 못하고 필요하지 않을지도 모릅니다.....

하지만 완벽한 프로그래머가 아니더라고 저런 개념들을 숙지하고 사전에 방지하여 버그없는, 효율적인 프로그램을 만들기위해 알아두셔야 될 겁니다.

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - const 키워드  (0) 2021.06.18
C 언어 - 형변환(Casting)  (0) 2021.06.17
C 언어 - 다차원 배열  (0) 2021.06.14
C 언어 - 포인터 / 포인터 변수  (0) 2021.06.13
C 언어 - 메모리주소  (0) 2021.06.12

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :