Почему мой Java шорт заполняется единицами с беззнаковым смещением вправо? - PullRequest
5 голосов
/ 10 февраля 2020

Когда я выполняю беззнаковый сдвиг вправо следующим образом:

short value = (short)0b1111111111100000;
System.out.println(wordToString(value));
value >>>= 5;

, я получаю 1111111111111111. Итак, значение смещено вправо, но заполнено 1 с, что похоже на то же поведение, что и >>

Однако я ожидал, что оно заполнится нулями независимо от знака, что приведет к следующему: 0000011111111111

Вот соответствующий REPL для игры с моим кодом: https://repl.it/@spmcbride1201 / shift-rotate

1 Ответ

3 голосов
/ 10 февраля 2020

Поведение, которое вы получаете, связано с тем, что short s повышается до int s перед применением операции сдвига. Фактически, если вы присваиваете результат оператора сдвига переменной int, вы получите ожидаемый результат:

  public static void main(String[] args) {

    short value = (short)0b1111111111100000;
    System.out.println(value); //-32, which is the given number
    int result = value >>> 5;
    System.out.println(result); //134217727, which is 00000111111111111111111111111111

  }

Если вы присвойте результат short, вы получите только младшие биты .

Это связано с тем, что язык байт-кода на самом деле не работает с типами, меньшими int.

...