Frage

eine Antwort auf SO bekam ich zu denken, ist JavaScript eine gewisse endian-Codierung über OSs und Browser garantieren?

Oder anders ausgedrückt sind bitweise Verschiebungen auf ganze Zahlen „sicher“ in JavaScript?

War es hilfreich?

Lösung

Ja, sie sind sicher. Obwohl Sie nicht die Geschwindigkeitsvorteile bekommen könnten Sie hoffen, da JS-Bit-Operationen „ ein Hack “.

Andere Tipps

Shifting ist sicher, aber Ihre Frage ist fehlerhaft, da endianness nicht Bit-Schichtbetrieb ohnehin nicht beeinträchtigt. Shifting links ist das gleiche auf Big-Endian und Little-Endian-Systeme in allen Sprachen. (Shifting kann rechts unterscheiden, aber nur wegen Auslegung des Vorzeichenbits, nicht die relativen Positionen aller Bits).

Endianness kommt nur ins Spiel, wenn Sie die Möglichkeit haben, einige Speicherblock als Bytes oder als größere ganzzahlige Werte zu interpretieren. Im Allgemeinen hat Javascript Sie diese Möglichkeit nicht geben, da Sie keinen Zugriff auf beliebige Speicherblöcke, vor allem nicht die Speicherblöcke von Variablen belegt. typisierten Arrays in einer Endian sensitiv Ansichten von Daten bieten, aber die Reihenfolge ist abhängig von der Host System; es ist nicht unbedingt das gleiche für alle möglichen Javascript Host-Umgebungen.

Endianness beschreibt physische Speicherreihenfolge, nicht logische Speicherreihenfolge. Logisch, das Bit ganz rechts ist immer das niedrigstwertige Bit. Ob das Bit des Byte ist derjenige, der auf der untersten Speicheradresse befindet, ist ein ganz anderes Thema, und es zählt nur, wenn Sie die Sprache ein solches Konzept setzt als „niedrigste Speicheradresse“, die Javascript nicht. Typisierten Arrays tun, aber dann nur im Rahmen von typisierten Arrays; sie bieten nicht noch Zugriff auf die Speicherung beliebiger Daten.

Einige dieser Antworten sind veraltet, weil endianness können relevant sein, wenn getippt Arrays! Bedenken Sie:

var arr32 = new Uint32Array(1);
var arr8 = new Uint8Array(arr32.buffer);
arr32[0] = 255;
console.log(arr8[0], arr8[1], arr8[2], arr8[3]);

Als ich dies in Chrome-Konsole ausführen, es ergibt 255 0 0 0, was darauf hinweist, dass meine Maschine Little-Endian ist. Allerdings typisierte Arrays verwendet das System endianness standardmäßig , so können Sie sehen 0 0 0 255 statt, wenn Ihre Maschine big-endian ist.

ECMA Script hat tatsächlich ein Konzept eines Integer-Typs, aber es wird implizit zu oder von einer mit doppelter Genauigkeit gezwungen Gleitkommawert wie nötig (wenn die Zahl vertreten zu groß ist, oder wenn es eine Bruchkomponente hat).

Viele Mainstream-JavaScript-Interpreter (Spidermonkey ist ein Beispiel) eine Verknüpfung in der Umsetzung übernehmen und alle numerischen Werte interpretieren als verdoppelt für jeden Befehl die tatsächliche nativen Typ des Wertes zu vermeiden, überprüft. Als Ergebnis der Umsetzung Hack werden Bitoperationen als Guss einen ganzzahligen Typen durch eine eingegossenen zurück zu einer Doppel Darstellung gefolgt umgesetzt. Es ist daher keine gute Idee Bit-Level-Operationen in Javascript zu verwenden, und Sie werden nicht eine Leistungssteigerung sowieso bekommen.

  

sind bitweise Verschiebungen auf ganze Zahlen "sicher" in JavaScript?

Nur für ganze Zahlen, die innerhalb von 32 Bits passen (31 + Zeichen). Im Gegensatz zu, sagen wir, Python, können Sie nicht 1 bekommen << 40.

Dies ist, wie die Bit-Operatoren sind definiert durch ECMA-262 zu arbeiten, auch wenn JavaScript Zahlen sind tatsächlich schwimmt. (Technisch gesehen doppelter Genauigkeit schwimmt, geben Sie 52 Bits Mantisse, leicht genug, um die Reichweite eines 32-Bit-int zu decken.)

Es gibt keine Frage des ‚Endian‘ beteiligt bitweise Arithmetik und kein Byte-Speicherformat, wo endianness beteiligt werden könnte, ist in JavaScript gebaut.

JavaScript keinen Integer-Typen hat, nur einen Gleitkomma-Typen. Man kann nie nahe genug, um die Details der Implementierung bekommen zu kümmern.

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