2014-01-21 2 views
1

간단한 질문 : 자바 부호없는 오른쪽 시프트를 적용하는 경우 바이트 왜 int로서 그 위협을 변수 (뿐만 아니라 짧은) :부호없는 오른쪽 시프트

byte x = -1; 
System.out.println(x >> 2); 
System.out.println(x >>> 1); 
System.out.println(Integer.MAX_VALUE); 

콘솔 출력 :

-1 
2147483647 
2147483647 
+1

부호없는 오른쪽 시프트뿐 아니라 거의 모든 연산자에서 int로 처리됩니다. – Ingo

답변

5

Java의 int 및 long에 대해서만 시프트 연산자를 사용할 수 있으므로 (다른 모든 숫자 연산자와 마찬가지로) 바이트를 이동하기 전에 자동으로 int로 캐스팅됩니다. 이는 또한 산술 오른쪽 시프트에서 발생하지만 -1 유형이 무엇이든간에 -1 >> 2은 -1입니다. 이진 표현 111...111이 오른쪽으로 이동되었으므로 111...111이 여전히 논리적으로 이동하는 동안 011...111 즉 시프트 된 유형의 최대 값이됩니다.

추 신 : 산술 시프트는 부호가있는 시프트이고 논리 시프트는 부호없는 시프트입니다.

+0

설명해 주셔서 감사합니다. 그것을 몰랐다. –

+0

@MarkoTopolnik done. – Njol

관련 문제