¿Cuál es la razón por la cual los lenguajes de alto nivel como C # / Java enmascaran el operando de conteo de desplazamiento de bits?

Esto es más un diseño de lenguaje que una pregunta de programación.

Lo siguiente es un extracto deJLS 15.19 Operadores de turno:

Si el tipo promocionado del operando de la izquierda esint, solo los cinco bits de orden más bajo del operando de la derecha se usan como la distancia de desplazamiento.

Si el tipo promocionado del operando de la izquierda eslong, entonces solo los seis bits de orden más bajo del operando de la derecha se usan como la distancia de desplazamiento.

Este comportamiento también esespecificado en C #, y aunque no estoy seguro de si está en la especificación oficial de Javascript (si hay una), también es cierto en base a mi propia prueba al menos.

La consecuencia es que lo siguiente es cierto:

(1 << 32) == 1

Entiendo que esta especificación probablemente esté "inspirada" por el hecho de que el hardware subyacente solo toma 5 bits para el operando de conteo cuando se cambian los valores de 32 bits (y 6 bits para 64 bits), y puedo entender tal comportamiento especificado en el Nivel JVM, por ejemplo, pero ¿por qué los lenguajes de alto nivel como C # y Java conservan este comportamiento de bajo nivel? ¿No deberían proporcionar una visión más abstracta más allá de la implementación del hardware y comportarse de manera más intuitiva? (¡Incluso mejor si pueden tomar un recuento negativo que signifique cambiar en la OTRA dirección!)

Respuestas a la pregunta(3)

Su respuesta a la pregunta