Was ist der Grund, warum Hochsprachen wie C # / Java den Operanden für die Anzahl der Bitverschiebungen maskieren?

Dies ist eher eine Sprachgestaltung als eine Programmierfrage.

Das Folgende ist ein Auszug ausJLS 15.19 Schichtoperatoren:

Wenn der hochgestufte Typ des linken Operanden istintwerden nur die fünf niedrigstwertigen Bits des rechten Operanden als Verschiebungsabstand verwendet.

Wenn der hochgestufte Typ des linken Operanden istlongwerden dann nur die sechs niederwertigsten Bits des rechten Operanden als Verschiebungsabstand verwendet.

Dieses Verhalten ist auchangegeben in C #und obwohl ich nicht sicher bin, ob es in der offiziellen Spezifikation für Javascript ist (falls es eine gibt), ist es zumindest auf der Grundlage meines eigenen Tests auch wahr.

Die Folge ist, dass Folgendes zutrifft:

(1 << 32) == 1

Ich verstehe, dass diese Spezifikation wahrscheinlich von der Tatsache "inspiriert" ist, dass die zugrunde liegende Hardware nur 5 Bit für den Zähloperanden benötigt, wenn 32-Bit-Werte verschoben werden (und 6 Bit für 64-Bit), und ich kann ein solches Verhalten verstehen, das unter angegeben ist JVM-Level zum Beispiel, aber warum sollten High-Level-Sprachen wie C # und Java dieses eher Low-Level-Verhalten beibehalten? Sollten sie nicht eine abstraktere Sicht über die Hardware-Implementierung hinaus bieten und sich intuitiver verhalten? (Noch besser, wenn sie negativ zählen können, um eine Verschiebung in die ANDERE Richtung zu bedeuten!)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage