カウントが型幅を超えた右シフトの未定義の動作
C の右シフト演算子 (>>) の動作は標準、特にセクション 5.8「シフト演算子」で定義されています。左オペランドの型の幅以上のシフト カウントが未定義の動作であるかどうかという疑問が生じます。
C 標準では、E1 >> の値は次のように規定されています。 E2 は、E1/2^E2 の商の整数部分です。ここで、E1 は左オペランド、E2 は右オペランドです。これは、E1 が符号なし型または非負値の符号付き型であり、E2 が負でない場合にのみ動作が定義されることを意味します。
ただし、この質問では、E1 が符号なし型である場合を考慮しています。 int であり、E2 は 34 であり、unsigned int の 32 ビット幅を超えています。標準では、この場合の動作は未定義であると明示的に述べられています。
したがって、商の計算に関する C 標準の記述にもかかわらず、カウントが 32 を超える unsigned int を右シフトする動作は未定義です。このため、GCC はそのようなシフトを実行するときに警告を発行します。
以上が型幅を超える数の符号なし整数を右シフトすると、C では未定義の動作になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。