1

Ich verstehe, was Nullauffüllungs Verschiebung nach rechts und Ergebnisse liefert es durchaus Sinn machen, wenn der zweite Operand nicht null ist:>>> (Nullauffüllungs Verschiebung nach rechts), wenn der zweite oprand Null

-7 >>> 1 
2147483644 

vergleichen mit

-7 >> 1 
-4 

Aber wenn der zweite Operand Null:

-7 >> 0 
-7 // Looks right! 
-7 >>> 0 
4294967289 // What? Why? 

Wenn ich Null-Bits bin Verschiebung, bedeutet nicht, es ich bin überhaupt nicht verschieben? Wenn das der Fall ist, sollte es mir nicht die ursprüngliche Nummer geben? Ich würde -7 >>> 0 === -7

erwarten und auch

-7 >>> 32 
4294967289 

Auch hier definitionsgemäß, würde ich -7 >>> n === 0 where n >= 32 erwarten, da alle Ziffern Nullen werden!

+0

https://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it – DAle

+0

@ DAle das hilft. Und die Spezifikation gibt den genauen Mechanismus. Siehe unten – Boyang

Antwort

2

Gefunden die interne Funktionsweise davon in specs.

x >>> 0 tun ToUint32(x)

Und

7.1.6 ToUint32 (Argument)

Die abstrakte Operation ToUint32 wandelt Argument einem der 232 ganzzahlige Werte im Bereich von 0 bis 232- 1, inklusive. Diese abstrakte -Operation funktioniert wie folgt: Es sei die Nummer ToNumber (Argument). ReturnIfAbrupt (Nummer). Wenn die Zahl NaN, +0, -0, + ∞ oder -∞ ist, geben Sie +0 zurück. Sei int der mathematische Wert, der das gleiche Vorzeichen wie Zahl ist und dessen Betrag floor (abs (Zahl)) ist. Int32bit sei int modulo 232. Return int32bit.

Hinweis Let int32bit int modulo und

werden, um die Notation „x modulo y“ (y ist endlich und ungleich Null sein) berechnet einen Wert k von dem gleichen Vorzeichen wie y (oder Null), so dass abs (k) < abs (y) und x-k ​​= q × y für eine ganze Zahl q.

So von oben Konvention -7 mod 2^32 === 2^32 - 7 === 4294967289

Verwandte Themen