Por que linguagens de alto nível, como C # / Java, mascaram o operando de contagem de deslocamento de bits?

Isso é mais um design de linguagem do que uma questão de programação.

A seguir, um trecho deOperadores de turno JLS 15.19:

Se o tipo promovido do operando esquerdo forint, apenas os cinco bits de ordem mais baixa do operando do lado direito são usados como a distância de deslocamento.

Se o tipo promovido do operando esquerdo forlong, somente os seis bits de ordem mais baixa do operando do lado direito são usados como a distância de deslocamento.

Esse comportamento também éespecificado em c #, e embora eu não tenha certeza se está na especificação oficial do Javascript (se houver), também é verdade com base no meu próprio teste.

A conseqüência é que o seguinte é verdadeiro:

(1 << 32) == 1

Entendo que essa especificação provavelmente é "inspirada" pelo fato de que o hardware subjacente leva apenas 5 bits para o operando de contagem ao alterar valores de 32 bits (e 6 bits para 64 bits), e posso entender esse comportamento especificado em Nível de JVM, por exemplo, mas por que linguagens de alto nível, como C # e Java, retêm esse comportamento de baixo nível? Eles não deveriam fornecer uma visão mais abstrata além da implementação de hardware e se comportar de maneira mais intuitiva? (Melhor ainda, se eles puderem ter uma contagem negativa para mudar na direção OUTRA!)

questionAnswers(3)

yourAnswerToTheQuestion