정수형 오버플로우가 일어나면 음수가 되는 이유

hwhyeons·2023년 1월 16일
0

2의 보수

컴퓨터에서는 정수를 표현할 때 2의 보수 표기법을 사용한다

간단하게 요약하면

  • 어떤 수를 음수로 바꾸고 싶으면 그 수의 모든 비트를 반전시키고 1을 더한다
  • 반대로 음수를 양수로 바꾸고 싶다면 그 수에서 1을 빼고 모든 비트를 반전시킨다

예를 들어, 어떤 자료형의 비트 수가 4고, 이 상황에서 +5를 표현한다고 하면
2의 보수 표기법에서 맨 앞은 부호 비트가 되므로

00101
이 된다.
이걸 음수로 바꾸면 반전시킨후 1을 더하면 되므로
11011
이다




자바에서 byte 자료형의경우 8bit인데, 맨 앞 부호비트를 제외하면

값을 표현할 수 있는 비트는 7비트고, 따라서 2^7 = 128이다.

하지만, byte의 최소값과 최대값을 찾아보면

-128과 +127이다

이 이유부터 알아보자



2의 보수를 생각하지말고 128을 이진수로 표현한다고 생각해보면

10000000 이다.

하지만, 방금 말한 것처럼 byte타입은 부호비트를 제외하고 7개만

사용가능하므로 byte 자료형에서 위의 수는 음수다.

따라서 byte로는 128이 표현이 불가능하다.

10000000을 2의 보수 표기법을 이용해서 숫자로 바꿔보면

10000000에서 1을 빼면 01111111이고 이걸 반전시켜주면

10000000이 되므로 결국 2의 보수 표기법에서 10000000은 -128이 된다.



이런 이유로, 2의 보수 표기법에서 byte 자료형은 양수의 경우 최대 127까지만

표현이 가능하고, 음수의 경우 -128까지 가능하다



이제 왜 127에서 1을 더하면 -128이 되는지를 알아보자.

127은 01111111이다. 여기서 1을 더하면

10000000이다. 위에 써놓은 것처럼 10000000은 -128이므로

정수 자료형의 최대값에서 값을 더하면 음수로 넘어가는 이유다.





0개의 댓글