Frage

Dies ist eher ein Sprachdesign eher als eine Programmierung Frage.

Im Folgenden ein Auszug aus JLS 15.19 Shift-Operatoren :

  

Falls der begünstigt Typ des linken Operanden int ist, werden nur die fünf niederwertigsten Bits des rechten Operanden werden als die Verschiebungsstrecke verwendet wird.

     

Falls der begünstigt Typ des linken Operanden ist long, dann werden nur die sechs niedrigstwertigen Bits des rechten Operanden werden als die Verschiebungsstrecke verwendet wird.

Dieses Verhalten ist auch angegeben in C # , und während ich bin mir nicht sicher, ob es für Javascript (wenn es eins) in der offiziellen Spezifikation ist, ist es auch wahr, basierend auf meinen eigenen Test zumindest.

Die Folge davon ist, dass die folgenden Bedingungen erfüllt ist:

(1 << 32) == 1

Ich verstehe, dass diese Spezifikation ist wahrscheinlich „inspiriert“ von der Tatsache, dass die zugrunde liegende Hardware dauert nur 5 Bits für den Zählwertoperand, wenn 32-Bit-Werte verschieben (und 6 Bits für 64-Bit), und ich kann ein solches Verhalten verstehen auf der JVM-Ebene zum Beispiel angegeben, aber warum dieses eher Low-Level-Verhalten hohe Sprachen wie C # und Java behalten würden? Sollten sie nicht eine abstraktere Ansicht über die Hardware-Implementierung zur Verfügung stellen und intuitiver verhalten? (Noch besser, wenn sie eine negative Zählung nehmen können bedeuten, in der anderen Richtung zu verschieben!)

War es hilfreich?

Lösung

Java und C # ist nicht vollständig "High-Level". Sie versuchen wirklich hart so sein, dass sie in effizienten Code kompiliert werden können, um Glanz in Mikro-Benchmarks. Aus diesem Grunde ist sie die „Wertetypen“ wie int statt mit hat, als Standard-Integer-Typen, true ganze Zahlen, welche Objekte in ihrem eigenen Recht sein würde, und nicht auf einen festen Bereich beschränkt.

Damit sie nachahmen, was die Hardware der Fall ist. Sie trimmen ein bisschen, dass sie Auftrag Maskierung, während C erlaubt ihn nur. # Java und C Dennoch sind "mittel-level" Sprachen.

Andere Tipps

Da in den meisten Programmierumgebungen eine ganze Zahl ist nur 32 Bit. So dann 5 Bits (die 32 Werte auszudrücken genug ist) ist bereits genug, um die gesamte ganze Zahl zu verschieben. Eine ähnliche Argumentation für einen 64-Bit vorhanden ist lang. 6 Bits alles, was Sie brauchen, ist vollständig den gesamten Wert verschieben

kann ich einen Teil der Verwirrung verstehen: Wenn Ihre rechter Operanden das Ergebnis einer Berechnung ist, dass endet mit einem Wert von mehr als 32 bis, könnte man erwarten, dass es nur alle Bits verschieben, anstatt eine Maske anwenden <. / p>

C # und Java definieren Verschiebung als nur mit den Bits niedriger Ordnung des Schiebezählwert wie das ist, was SPARC- und x86-Schichtanweisungen tun. Java wurde ursprünglich von Sun auf Sparc-Prozessoren implementiert, und C # von Microsoft auf x86.

Im Gegensatz, C / C ++ lassen als das Verhalten von Verschiebungsanweisungen nicht definiert, wenn die Verschiebungszahl nicht im Bereich 0..31 (für ein 32-Bit-int), so dass jedes Verhalten. Das ist, weil, wenn C zuerst implementiert wurde, verschiedene Handware diese unterschiedlich gehandhabt. Zum Beispiel auf einem VAX, durch einen negativen Betrag Verschiebung verschiebt die andere Richtung. So mit C, kann der Compiler nur die Hardware-Schaltanweisung verwenden und tun, was es tut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top