Я занимаюсь для экзамена SCJP с помощью примечаний давки из Интернета.
Согласно моим примечаниям >>
оператор, как предполагается, является подписанным сдвигом вправо, при этом знаковый бит вводится слева. В то время как левый оператор смещения <<
как предполагается, сохраняет знаковый бит.
Играя вокруг однако, я могу сместить знак с <<
оператор (f.e. Integer.MAX_VALUE << 1
оценивает к -2
, в то время как я так и не смог сместить знак с >>
оператор.
Я должен неправильно понимать что-то здесь, но что?
">>" подписано, потому что оно сохраняет знак. В качестве заполнителя используется самая левая цифра в двоичном представлении числа. Например:
| this value is used as a filler
11011011
>> 11101101
01010010
>> 00101001
«>>>» - беззнаковая версия этого оператора. В качестве заполнителя всегда используется ноль:
11011011
>>> 01101101
01010010
>>> 00101001
В двоичном представлении самая левая цифра определяет знак числа. Итак, если это «1», то у нас отрицательное значение, а если «0» - то наше число положительное. Поэтому использование самой левой цифры в качестве заполнителя позволяет сохранить знак постоянно.