Operador de cambio poco inteligente con cambio por número negativo

Me encontré con un escenario interesante, cuando trabajaba con un operador de cambio a nivel de bit. Si el segundo operando es negativo, ¿cómo funciona la operación de desplazamiento a nivel de bits? .

es decir, a << b, "<<" desplaza un patrón de bits a la izquierda por b bits en a. Pero si b es neagtive, ¿no debería ser un error en tiempo de ejecución?

¿Puedo ejecutar el código siguiente con éxito pero no entiendo cómo funciona?

 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);
}

Entrada

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

Resultados

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

ASCII para 'a' es 97. ¿Puede alguien ayudarme a entender cómo funciona esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta