C # Bit-Verschiebung: Dieses Verhalten ist in der Spezifikation, ein Fehler oder Zufall?
Frage
Ich arbeite mit Bitverschiebung Operatoren (meine Frage Bit Array Gleichheit ) und einem SO Benutzer einen Fehler in meiner Berechnung meiner Schicht wies darauf hin, Operanden - ich war für einen int eine Reihe von [1,32] anstelle von [0,31] zu berechnen. (Hurray für die Gemeinschaft SO!)
In der Behebung des Problems, ich war überrascht, das folgende Verhalten zu finden:
-1 << 32 == -1
In der Tat scheint es, dass n << s
kompiliert wird (oder von der CLR interpretiert - ich habe nicht die IL überprüfen). Als n << s % bs(n)
wo bs (n) = Größe in Bits von n
Ich würde erwarten:
-1 << 32 == 0
Es scheint, dass der Compiler erkennt, dass Sie über die Größe des Ziels verschieben und Ihre Fehler zu korrigieren.
Dies ist eine rein akademische Frage, aber weiß jemand, ob dies in der Spezifikation definiert ist (ich nichts unter
Lösung Ich glaube, dass der relevante Teil der Spezifikation ist hier: für die vordefinierten Operatoren, die Anzahl von Bits zu verschieben, wird wie folgt berechnet: Wenn der Typ von x int oder uint ist, wird die Verschiebungszahl durch die gegebenen
niederwertigen fünf Bits des Grafen. Mit anderen Worten wird die Verschiebungszahl berechnet
von Graf & 0x1F. Wenn der Typ von x lang oder ulong ist, wird die Verschiebungszahl durch die gegebenen
niedrige Ordnung sechs Bits des Grafen. Mit anderen Worten wird die Verschiebungszahl berechnet
von Graf & 0x3F. Wenn die resultierende Schiebezählwert Null ist, kehren die Shift-Operatoren einfach den Wert
von x.
Der Wert
32
ist 0x20
. Der Ausdruck 0x20 & 0x1F
ausgewertet 0
. Daher ist die Verschiebungszahl Null und keine Verschiebung ist getan; der Ausdruck -1 << 32
(oder jeder x << 32
) nur gibt den ursprünglichen Wert.