1UnitedPower: Bitoperatoren und Unsigned Integer

Beitrag lesen

Meine Herren!

_('mesg').innerHTML = 0xFFFFffff << 0; // -1

Das ist also völlig unbrauchbar, was da ausgegeben wird. Das liegt, wie 1UnitedPower schrieb, an der inneren Verarbeitung der Bytes und die ist, weil 'float 64 bit': eben nicht auf einen uint32 ausgerichtet.

Der Martin hat mich an dieser Stelle ja bereits korrigiert. Hier nochmal eine genauere Erläuterung:

Alle numerischen Zahlenwerte werden als double-precision 64bit floating point gespeichert. Bestimmte Operatoren, wie die Binär-Operatoren, wandeln die binäre Repräsentation ihrer Operanden allerdings um. Das Ergebnis ist allerdings wieder eine Gleitkommazahl. Der Wertebereich des Ergebnisses liegt aber im Wertebereich des intern benutzten Binärformats.

Ein Beispiel: Der Linksshift-Operator << rechnet mit einer 32bit-Int Repräsentation des linken und einer 32bit-UInt Repräsentation des rechten Operanden. Der Wertebereich von 32bit-Int reicht von -2^31-1 bis 2^31-1. Insbesondere gehört der Wert 0xFFFFffff also nicht zum Wertebereich. Es ist folglich keine intuitive Umwandlung der Repräsentation möglich. Der Algorithmus, der diese Ausnahme Umwandlung vornimmt kann hier in der Spezifikation nachgelesen werden. Wie hottis Test schon gezeigt hat, wird der Wert auf eine 0 gemappt.

Interessant für dich hotti ist der vorzeichenlose Rechtsshift-Operator >>>.
Der rechnet nämlich mit einer 32bit-UInt Repräsentation seines linken Operanden. 0xFFFFffff liegt also im Darstellbaren Wertebereich.

  
0xFFFFffff >>> 0;  // 4294967295  
-1 >>> 0;          // 4294967295  
0x100000000 >>> 0; // 0  
0x100000001 >>> 0; // 1  

--
“All right, then, I'll go to hell.”