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 |