私はビット シフト演算子を使用していました (私の質問Bit Array Equalityを参照してください)。SO ユーザーが私のシフト オペランドの計算のバグを指摘しました。[0,31] ではなく [1,32] の範囲を計算していました。 int の場合。(SO コミュニティに万歳!)
問題を修正する際に、次の動作を見つけて驚きました。
-1 << 32 == -1
実際、それはbs(n) = n のサイズ (ビット単位n << s
) としてコンパイルされている (または CLR によって解釈されている - 私は IL をチェックしていませんでした)ように見えます。n << s % bs(n)
私は期待していたでしょう:
-1 << 32 == 0
コンパイラは、ターゲットのサイズを超えてシフトしていることに気づき、間違いを修正しているようです。
これは純粋に学術的な質問ですが、これが仕様で定義されているかどうか (私は7.8 Shift operatorで何も見つかりませんでした)、未定義の動作の偶然の事実であるかどうか、またはこれがバグを生成する可能性がある場合があるかどうかは誰にもわかりませんか?