Оператор битового сдвига со сдвигом на отрицательное число

Я столкнулся с интересным сценарием, когда работал с побитовым оператором сдвига. Если второй операнд отрицательный, как работает операция побитового сдвига?,

i. < b, < < сдвигает бит влево на b бит в a. Но если b неадаптивен, разве это не ошибка во время выполнения?

Я могу успешно выполнить приведенный ниже код, но я не понимаю, как он работает?

 public static void bitwiseleftShift(char testChar)
{
    int val=testChar-'a';
    int result= 1<<val;
    System.out.println("bit wise shift of 1 with val="+val+" is "+result);
}

Ввод

   bitwiseleftShift('A');// ASCII 65
   bitwiseleftShift('0'); // ASCII 48 

Результаты

   bit wise shift of 1 with val=-32 is 1
   bit wise shift of 1 with val=-49 is 32768

ASCII для 'a' - 97. Может ли кто-нибудь помочь мне понять, как это работает?

Ответ 1

Но если b является неагрессивным, разве это не ошибка во время выполнения?

Не в соответствии с Спецификацией языка Java, раздел 15.19:

Если продвинутый тип левого операнда является int, в качестве расстояния сдвига используются только пять младших бит правого операнда. Это как если бы правый операнд подвергался поразрядному логическому оператору И и (§15.22.1) с значением маски 0x1f (0b11111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.

Таким образом, сдвиг -32 фактически заканчивается как сдвиг 0, а сдвиг -49 фактически заканчивается как сдвиг 15 - следовательно, результаты, которые вы видели.