Integer.MIN_VALUE == -Integer.MIN_VALUE
Effective Java로 유명한 Joshua Bloch의 트윗에 재미있는 글이 올라왔다.
And while we're at it, Integer.MIN_VALUE
== -Integer.MIN_VALUE == Math.abs(Integer.MIN_VALUE)
엥, 어떤 수에 -1을 곱했는데 자기 자신이 된다고? 곧장 테스트 프로그램을 만들어 확인해봤더니 정말 그렇다. 확인을 해보니 예전에 학교에서 배웠던 게 생각이 났다. 정수형을 표현할 때 2의 보수법을 사용해 표현한다는 것! 정확한 내용이 생각나지 않아 잠시 인터넷에서 검색해보니 잘 설명된 자료(2의 보수 표기법)가 있다.
3비트 정수를 2의 보수법으로 표현했을 때
MIN_VALUE=100, -1=111이 될 것이다.
-1 =
111
+ MIN = 100
------------
11100 --> 100 = MIN
따라서
MIN 값을 -1과 곱하면 다시 자기 자신이 되는 것이다. 실제 Integer나 Long도 자리수만 더 많다뿐이지 원리는 동일하다. 따라서 Integer.MIN_VALUE
= -Integer.MIN_VALUE다. 테스트해보지 않아도 알겠지만 Long도 마찬가지다
|
1 2 3 |
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 |
MIN = 100 |
따라서...
|
1 2 |
Integer.MAX_VALUE
+ 1 == Integer.MIN_VALUE Integer.MAX_VALUE
== Integer.MIN_VALUE - 1 |
이것 역시 Long도 마찬가지다. 프로그램을 작성하면서 아직
Integer.MIN_VALUE나
Integer.MAX_VALUE를 쓸 일이 없어 미처 깨닫지 못했었는데, 재미있는 사실을 알게 되었다.
public class InTheLoop { public static final int END = Integer.MAX_VALUE; public static final int START = END - 100; public static void main(String[] args) { int count = 0; for (int i = START; i <= END; i++) count++; System.out.println(count); } }
-- 추가로 관련하여 소스를 올려 본다.
위 내용을 다 이해 했으면 count는 무었이 찍힐까!?
<http://ntalbs.tistory.com/136>에서 삽입