Integer.MIN_VALUE

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

Integer.MIN_VALUE

Joshua Bloch의 트윗 스크린샷

Effective Java로 유명한 Joshua Bloch의 트윗에 재미있는 글이 올라왔다. 엥, 어떤 수에 -1을 곱했는데 자기 자신이 된다고? 곧장 테스트 프로그램을 만들어 돌려봤더니 정말 그렇다.

확인 해보니 예전에 학교에서 배웠던 게 생각이 났다. 정수형을 표현할 때 2의 보수법을 사용해 표현한다는 것! 정확한 내용이 생각나지 않아 잠시 인터넷에서 검색해보니 잘 설명된 자료(2의 보수 표기법)가 있다.

3비트 정수를 2의 보수법으로 표현했을 때 MIN_VALUE=100, -1=111이 될 것이다.

      -1 = 111
  x  MIN = 100
  ------------
         11100 --> 100 = MIN

따라서 MIN 값을 -1과 곱하면 다시 자기 자신이 되는 것이다. 실제 IntegerLong도 자릿수만 더 많다뿐이지 원리는 동일하다. 따라서 Integer.MIN_VALUE = -Integer.MIN_VALUE다. 테스트해보지 않아도 알겠지만 Long도 마찬가지다

Integer.MIN_VALUE == -Integer.MIN_VALUE
Integer.MIN_VALUE = Math.abs(Integer.MIN_VALUE)
Long.MIN_VALUE == -LONG.MIN_VALUE

조금 더 테스트해보면 Integer.MIN_VALUE와 Integer.MAX_VALUE와의 재미있는 관계도 알 수 있다. 이것도 생각을 쉽게 하기 위해 3비트 정수로 계산해보면...

     MAX = 011
  +    1 = 001
  ------------
           100 --> MIN
     MIN = 100
  +   -1 = 111
  ------------
          1011 --> 011 --> MAX

따라서...

Integer.MAX_VALUE + 1 == Integer.MIN_VALUE
Integer.MAX_VALUE == Integer.MIN_VALUE - 1

Long도 마찬가지다. 프로그램을 작성하면서 Integer.MIN_VALUEInteger.MAX_VALUE를 쓸 일이 없어 미처 깨닫지 못했었는데, 재미있는 사실을 알게 되었다.