負のオペランドのコンテキストでの左シフト演算と未定義の動作
C では、左側のオペランドが負の場合、左シフト演算により未定義の動作が呼び出されます。 ISO C99 によれば、この動作は非負符号付きオペランドについてのみ明確に定義されています。これは、空になったビットを表す際の潜在的なあいまいさに起因します。
C の違い
C とは対照的に、C は負のオペランドを使用した左シフト演算の動作を定義します。 C -03 は、結果が、指定された位置数だけ左にシフトされた左オペランドのビット パターンであり、空いたビットにはゼロが埋め込まれることを指定します。さらに、左側のオペランドが符号なしの場合、結果は、オペランドに 2 を乗算し、シフト カウントを乗算し、型に応じて特定の定数を法として減算したものになります。
未定義の動作の理由in C
C での未定義の動作は、空になったビットを処理する方法の問題から発生します。左シフト演算の場合、空いたビットは 1 または 0 で埋められる可能性がありますが、動作は一貫している必要があります。たとえば、式 -1
右シフト演算の複雑さ
一方、負のオペランドを使用した右シフト演算は実装定義のみであり、未定義ではありません。これは、空いたビットがシフトアウトされるビットで埋められるためです。 2 の補数表現では、符号ビットがシフトアウトされ、単純に結果が正か負かを判断します。実装には、空いたビットをゼロで埋めるか符号ビットで埋めるかを決定できる柔軟性があり、動作を実装定義にします。
以上が負の数値の左シフトが C では未定義の動作であるのに、C では定義されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。