2011/12/20 13:34

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
+    1 = 001
------------
         111 --> MIN  

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

따라서...

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>에서 삽입

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 유니온베이비