unsigned 8bit 데이터 1111_1111에 대해서 1을 더하면 어떻게 될까? 표현할 수 있는 최대값을 넘어가서 어떠한 현상이 벌어질 것이다. 이것을 오버플로우(Overflow) 라고 한다.

1 1 1 1 1 1 1 1

혹은 0000_0000에 대해서 1을 빼면 어떻게 될까? 생각해보자. 표현할 수 있는 최솟값을 넘어가서 어떠한 현상이 벌어질 것이다. 이것을 언더플로우(Underflow)라고 한다.

0 0 0 0 0 0 0 0

그리고 C, VisualStudio2019 환경에서 실행해본 결과이다.

#include <stdio.h>

int main()
{
	unsigned char num0 = 255;			//unsigned char 최댓값
	num0++;
	printf("overflow : %d\n", num0);	//결과값 0

	unsigned char num1 = 0;				//unsigned char 최솟값
	num1--;
	printf("underflow : %d\n", num1);	//결과값	255
	return 0;
}

 

반면에 signed의 경우는 어떻게 될까?

#include <stdio.h>

int main()
{
	char num0 = 127;					//char 최댓값
	num0++;
	printf("overflow : %d\n", num0);	//결과값 -128

	char num1 = -128;					////char 최솟값
	num1--;
	printf("underflow : %d\n", num1);	//결과값	127
	return 0;
}

 

두 경우다 overflow가 발생할 경우 최솟값으로 바뀌고 underflow가 발생하는 경우 최솟값으로 바뀌는 것을 확인 할 수 있었다.

 

왜 이런 현상이 발생할까? bit단위로 들어가서 분석해보자.

 

오버플로우(Overflow) 현상

 

우선 unsigned char 최댓값 255에 1을 더한 경우다.

1 1 1 1 1 1 1 1

에서 1이 더해지면서 전부 0 이 되어 최솟값인 0으로 표현된 것이다.

0 0 0 0 0 0 0 0

0으로 된 것이다.

 

signed char 최댓값 127에 1을 더한 경우이다.

0 1 1 1 1 1 1 1

1이 더해져서

1 0 0 0 0 0 0 0

이 나타나고 이것을 해석하면 -128이 나타난다. (2의 보수이기 때문)

 

언더플로우(Underflow) 현상

 

unsigned char 최솟값 0에 +(-1)을 한 경우이다.

0 0 0 0 0 0 0 0

+(-1)

1 1 1 1 1 1 1 1

=

1 1 1 1 1 1 1 1

즉, 255가 나온다.

 

 

signed char 최솟값-128에 +(-1)을 한 경우이다.

1 0 0 0 0 0 0 0

+(-1)

1 1 1 1 1 1 1 1

=

0 1 1 1 1 1 1 1

즉, 127이 나온다.

 

예시

이러한 오류는 실생활에서 몇번 발생했는데 오버플로우 대표적인 예시로는 유튜브의 싸이의 강남스타일 뮤비가 있다.

https://www.bloter.net/newsView/blt201412040007

 

언더플로우 대표적인 예시로는 리그오브레전드의 비에고 언더플로우 사건이 있다.

https://gall.dcinside.com/board/view/?id=leagueoflegends4&no=2389514

'공부 > CS' 카테고리의 다른 글

XOR 암호화, XOR 교체 알고리즘  (0) 2022.01.21
이진 음수 표현 ,1의보수(1's Complement), 2의 보수(2's Complement)  (0) 2021.06.25
진수 표현  (0) 2021.06.25