Integer Overflow
오버플로우 개념은 간단하다.
말 그대로 넘쳐 흐르는 것이다.
주어진 크기보다 큰 입력이 들어와서 원래의 의도와 다르게 동작하는 것을 오버플로우라고 한다.
그리고 그 대상이 버퍼이면 버퍼 오버플로우가 되는 것이고, 자료형 int가 된다면 Integer Overflow가 되는 것이다.
int의 범위는
–2,147,483,648 ~ 2,147,483,647 |
위와 같다. (-2^31 ~ 2^31 -1)
따라서 int형 변수에 2,147,483,647을 초과한 숫자를 입력하면 오버플로우가 발생한다.
2,147,483,647 (10) = 01111111111111111111111111111111(2) 이다.
그런데 여기서 1을 초과하게 된다면 어떻게 될까?
2,147,483,648 (10) = 10000000000000000000000000000000(2) 이 된다.
그런데, 최상위 1비트는 부호비트(0: 양수, 1:음수)를 의미한다.
즉, 오버플로우로 인해 부호비트가 바뀌었고, 따라서 음수가 되는 것이다.
또 음수를 저장할 때는 2의 보수을 사용하는데, 한마디로 1을 빼고 비트를 반전시킨다고 생각하면 된다.
(10000000000000000000000000000000(2) - 1) xor (11111111111111111111111111111111(2))
= (01111111111111111111111111111111) xor (11111111111111111111111111111111(2))
= 1000000000000000000000000000000(2)
즉, 2,147,483,647를 1을 초과하면 2,147,483,648가 되는데, 음수가 되어서 - 2,147,483,648가 되는 것이다.
(그리고 초과하는 값이 1에서 커질 수록, 그 커진 값만큼 - 2,147,483,648에 더한 값이 된다.)