2014-01-21 2 views
1

Простой вопрос: почему, если я применяю сдвиг вправо без знака в Java в байт переменной (и короткие, а) оно нависшей над ней как INT:сдвиг вправо без знака в Java

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

Можно использовать только операторы сдвига для ints и longs в Java (как и все другие числовые операторы), поэтому байт автоматически переносится в int перед его переносом. Это также происходит с арифметическим сдвигом вправо, но -1 >> 2 равно -1 независимо от того, какой тип -1 есть, поскольку двоичное представление 111...111 сдвинуто вправо арифметически, все равно 111...111, а логически сдвинуто, оно становится 011...111, то есть максимальным значением сдвинутого типа.

PS: Арифметический сдвиг - это сдвиг с фиксацией, а логический сдвиг - сдвиг без знака.

+0

Спасибо за разъяснение. Не знал этого. –

+0

@MarkoTopolnik сделано. – Njol

Смежные вопросы