2010-02-24 9 views
5

Ich arbeitete mit Bit-Shift-Operatoren (siehe meine Frage Bit Array Equality) und ein SO-Benutzer wies auf einen Fehler bei der Berechnung meines Schichtoperanden hin - ich berechnete einen Bereich von [1,32] statt [0,31] für einen Int. (! Hurra für die Gemeinschaft SO)C# Bit Shift: ist dieses Verhalten in der Spezifikation, ein Fehler oder zufällig?

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 durch die CLR- interpretiert -Ich habe die IL nicht überprüft) als n << s % bs(n) wo bs (n) = Größe, in Bits, von n.

ich erwartet hätte:

-1 << 32 == 0 

Es scheint, dass der Compiler erkennen, dass Sie über die Größe des Ziel verschieben und Ihre Fehler zu korrigieren.

Dies ist eine rein akademische Frage, aber weiß jemand, ob dies in der Spezifikation definiert ist (ich konnte nichts bei 7.8 Shift operators finden), nur eine zufällige Tatsache von undefiniertem Verhalten, oder gibt es einen Fall, wo dies eine produzieren könnte Fehler?

Antwort

9

Ich glaube, dass der relevante Teil der Spezifikation ist hier:

Für die vordefinierten Operatoren, die Anzahl der Bits wird berechnet zu verschieben, wie folgt:

  • Wenn der Typ von x ist int oder uint, der Verschiebungszählwert wird durch niederwertige fünf Bits der Zählung gegeben. Mit anderen Worten, die Verschiebezahl wird aus der Zählung & 0x1F berechnet.

  • Wenn der Typ von x lang oder ulong ist, wird der Verschiebungszähler durch die niederwertigen sechs Bits der Zählung gegeben. Mit anderen Worten, die Verschiebezahl wird aus der Zählung & 0x3F berechnet.

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 ergibt 0. Daher ist der Verschiebezählwert Null und es wird keine Verschiebung durchgeführt; Der Ausdruck -1 << 32 (oder eine beliebige x << 32) gibt nur den ursprünglichen Wert zurück.

+0

Ah natürlich. Ich habe das gelesen, aber mein Verstand muss verschwunden sein. Macht perfekt Sinn. Vielen Dank! –