문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 오버플로 (문단 편집) == 원인 == [include(틀:상세 내용, 문서명=컴퓨터에서의 수 표현)] 컴퓨터의 메모리가 8비트의 데이터를 저장할 수 있다고 하고, 편의상 부호는 없는 양수인 경우만 고려해 보자. 가장 작은 값은 0000 0000 (=0) 이며, 1씩 증가시키면 0000 0001 (=1)을 거쳐 최댓값인 1111 1111 (=255)에 도달하게 된다. 여기에서 1을 다시 한번 더하게 되면 '''최댓값의 범위를 넘어서게 되고''', 최솟값인 0000 0000 (=0) 으로 되돌아가게 된다. 이를 '''오버플로'''라고 부른다. 이는 2의 보수를 사용하는 부호형 정수 방식(signed integer)에서도 동일하며, 8비트 정수형은 -128 ~ 127 사이의 값을 저장할 수 있다. 그런데, 0111 1111 (=127) 에서 1을 더하게 되면 1000 0000 인데, 이는 -128 이 된다. 이 역시 최댓값의 범위를 넘어서서 가장 작은 값으로 바뀌는 것이다. 32비트 부호형 정수형이라면 -2147483648 ~ 2147483647 이며, 이 경우에도 2147483647 + 1 은 허용범위를 초과하므로 최솟값인 -2147483648 가 된다. 반대로, 정수의 최솟값에서 1을 뺄 경우에는 최댓값이 되어 버린다. 즉 -2147483648 - 1 = 2147483647 이 된다. 일부 사람들이 이 경우를 [[언더플로]]라고 부르지만 '''잘못된 표현'''이며, 이 경우 또한 오버플로라고 부르는게 맞다. 양이건 음이건 범위를 벗어나면 모두 오버플로이다. 산술 언더플로(Arithmetic underflow)는 부동소수점 연산에서 지수부가 타입의 한계를 넘어 작아지면 0에 가까워지다가 결국 0이 되어버리는 현상을 의미한다. 하지만, 정수 자료형에서 최댓값에서 최솟값으로 넘어가는 오버플로와 구분하기 위해 언더플로라는 용어를 혼용해서 사용하고 있는데, 명확하게 하기 위해서는 '정수 언더플로'(Integer underflow)라는 용어를 사용해 산술 언더플로와 다르다는 것을 명시하는 것이 좋다. 오버플로의 가장 많은 예로 스택 오버플로([[버퍼 오버플로|Stack Overflow]])가 있다. 함수는 변수 등을 저장하기 위해 스택이라는 메모리 공간을 만드는데, 이 함수가 재귀적으로 계속 실행되면 스택이 점점 생겨난다. 이러면 어느 순간 메모리가 모자라는 순간이 되는데 이때 생기는 오류다. 프로그래밍 언어를 만들 때, 이 스택 오버플로가 잘 일어나지 않도록 하는 것도 일이다. 응용형으로 [[버퍼 오버플로]](Buffer overflow)가 있다. 할당된 범위의 메모리를 벗어난 주소로 접근하게 되는 것으로, [[하트블리드|하트블리드 사태]]도 이런 버퍼 오버플로로 벌어진 것이다. 컴퓨터 또는 프로그래밍 언어의 동작에 따라, 오버플로 발생 시 오류 메시지를 출력하는 경우도 있고[* 프로그래머가 코딩을 하며 catch, try 등으로 [[예외 처리]]를 했으면 오류 메세지가 뜬다. 보통은 '메모리가 XXXXXX~YYYYYY 값을 초과하였습니다. 이 메모리는 read될 수 없습니다' 와 같이 뜬다.], 그러지 않는 경우도 있다. 이 중 오류 메시지를 출력하지 않는 경우가 더 위험하다. 잘못된 정보로 명령을 계속 수행하므로 잘못된 값을 출력하거나 오류 메시지를 출력하는 곳과 오버플로가 일어난 곳이 다른 일이 일어날 수가 있다. 일부 프로그래밍 언어의 경우는 오버플로가 일어나지 않도록 언어 자체적으로 보완책을 가지는 경우도 존재한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기