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?
Ah natürlich. Ich habe das gelesen, aber mein Verstand muss verschwunden sein. Macht perfekt Sinn. Vielen Dank! –