Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]

오버플로우(Overflow)

2010. 3. 25. 15:08programming/terms

728x90

overflow 는

'강물이 범람하다' 또는 '물이 흘러 넘치다' 라는 사전적 의미를 가지고 있습니다.
이것을 프로그래밍 언어에 적용해보면,
모든 언어에서는 데이터를 임시로 저장해 둘 수 있는 '변수'라는 것을 사용합니다.
변수를 100 리터 짜리 물통에 비유를 한다면,
이 물통에 100 리터 이상의 물을 담았을때 발생하는 현상이 바로 overflow입니다.
100리터 까지만 물통에 남아있고, 그 이상은 넘쳐 흐르겠지요...
100바이트를 저장할 수 있는 변수에
110바이트의 데이터를 저장하려 했다고 한다면,,
컴퓨터(컴파일러)는 당연히 경고메시지를 보여주거나 이를 무시하고
100바이트의 데이터만 저장합니다.
나머지 10바이트가 굉장히 중요한 데이터라면, 또는 10바이트가 떨어져 나간
100바이트의 데이터가 아무런 의미가 없다면,
이런일이 발생하지 않도록 신경을 써야하겠지요...
프로그래밍 도중 overflow는 빈번히 일어납니다.
가장 대표적인 예로 배열의 index와 변수타입의 저장범위를 넘어서는
overflow를 들수 있는데,

int index[10]; 이라고 선언한 배열에서
index[10] = 10; 이라는 문장을 실행했을때 overflow라 할수 있습니다.
(인덱스 0부터 순차적으로 저장해왔다는 가정하에서 입니다.
하지만 어떤경우, 이것은 overflow가 아닐 수도 있습니다.
왜냐하면, 배열의 인덱스만큼 할당해놓은 저장공간과 바로 뒷부분에 인접한
공간이 메모리 할당이 되어있지 않은경우,
컴파일러는 묵시적으로 그 자리에 넘친 데이터를 저장해놓고,
그부분에 접근하는 것을 허용하기도 합니다.)

int number;
number = 10000000000000000; 이와 같은 문장도 overflow입니다.

integer의 overflow에 대해서만 간략하게 설명하겠습니다..
컴퓨터 마다 다르겠지만
integer가 4byte(32bit)를 차지한다고 하면
맨 앞 비트는 sign 비트로 사용됩니다.

그러면
integer의 가장 큰 수는
01111111111111111111111111111111 가 되겠지요 메모리 상에서
2^31-1이 되겠죠?

그렇다면 여기에다가 1을 더하면 어떻게 될까요?
01111111111111111111111111111111
00000000000000000000000000000001
--------------------------------
10000000000000000000000000000000

이 됩니다.. 앞서 말했지만 맨앞은 sign bit라고 합니다.
즉, 음수가 됩니다 음수 얼마를 나타내냐구요?

11111111111111111111111111111111 이 -1 입니다.
음수는 2's complement로 표현된답니다.

4bit만 봤을 때 5는
0101이고 -5 는
1010(뒤집은) +1 = 1011 이 됩니다.. 즉
10000000000000000000000000000000 이 값은
-2^31 이 됩니다.


2^31-1 + 1 은 2^31 이 되야 하는데 음수가 됩니다.
즉 양수 + 양수 해서 음수가 나와 버립니다.
이것이 오버플로우 입니다.
음수 + 음수 = 양수가 되는 경우는 언더플로우라고 합니다.
오버플로우 언더플로우는 메모리의 사이즈와 sign비트의 사용에 의해
어쩔 수 없이 발생되는 것입니다.

#include <stdio.h>

void main()
{
    int n = 2147483638;

    for (int i = 1; i <= 20; i++)
        printf("%d\n", n++);
}

자료형의 상한값보다 크다거나 하한값보다 작을 때 오버플로우가 일어나는데,
10번째 출력이 끝난 뒤 n이 int형의 상한값(INT_MAX = 2147483647)보다 커지게되므로,
11번째 출력부터 오버플로우 된 값들이 출력되게 됩니다.

728x90

'programming > terms' 카테고리의 다른 글

객체지향 _ 객체, 클래스, 인스턴스  (0) 2010.05.19
자바 charAt(0)  (0) 2010.03.30
서블릿(Servlet)  (0) 2010.03.26
지역 변수 와 멤버 변수  (0) 2010.03.25
리터럴(literal) 이란?  (0) 2010.03.24