Arithmetic in JAVA

Tags:

After Java Puzzlers

public class Test {
    public static void main(String[] args) {

        short i = -1;
        i >>>= 1; // okay
        i = i >>> 1; // error
    }
}

short, byte, char 는 항상 int로 변환된 뒤 계산됩니다. 따라서 i >>> 1은 int죠. 하지만 >>>= 와 같은 compound assignment는 자동으로 좌측 오퍼런드 (이경우엔 i)의 타입으로 casting 합니다. 반면 = 는 그렇지 않습니다. 따라서 첫번째 식은 에러가 나지 않지만 두번째 식은 에러가 나죠.

그러면 첫번째가 좋은거냐.. 면 그건 아닙니다. 정작 문제는 첫번째의 제대로 컴파일 되버리는 경우입니다. 왜냐하면 >>>= 의 계산시 연산이 int에서 이루어지고 나서 암시적으로 short로 캐스팅되므로 이 부분에서 possible loss of precision이 발생되는데 이것이 실행시에 발견되지 않을 가능성이 높기 때문입니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *