int형이라고 했을 때 을 비트로 표현하면
입니다. (이 32개)
왼쪽 시프트 연산자인 은 제일 오른쪽에 을 밀어넣어, 제일 왼쪽에 있는 숫자는 밀어내는 것과 같습니다.
이라면 을 한번 밀어넣는 것이 되어
이 됩니다.(이 31개, 가장 오른쪽에 이 1개)
는 위의 과정을 32번하는 것으로 결국
이 됩니다.(이 31개, 가장 오른쪽에 이 1개)
즉, 는 이 됩니다.
c언어에서도 테스트해보면 는 이 나옵니다.
자바에서는 를 하면 이 아닌 다른 값이 나옵니다.
이 아닌 이 나오게 됩니다. 왜 그런 것일까요?
아래 링크에 이에 대한 설명이 나와 있습니다.(15.19. Shift Operators)
https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.19
If the promoted type of the left-hand operand is int, then only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f (0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive.
Left shift연산()의 오른쪽 피연산자의 값이 에서 까지 유효하다고 합니다. 오른쪽 피연산자의 값이 만약 이 범위를 벗어난다면 최하위 비트 다섯 개만 읽는다고 합니다.
그래서 를 하게되면 여기서 는 이므로 앞의 다섯 개의 비트만 읽어 으로 보고 연산하게 됩니다. 즉, 의 값을 내어 -1이 나오게 되는 것입니다.
그래서 를 와 같이 표현하면 올바른 값을 얻을 수 있습니다.