ホームページ >バックエンド開発 >C++ >負の数の左シフトが C では未定義の動作であるのに、C では明確に定義されているのはなぜですか?

負の数の左シフトが C では未定義の動作であるのに、C では明確に定義されているのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 07:27:25247ブラウズ

Why is Left Shifting a Negative Number Undefined Behavior in C but Well-Defined in C  ?

C の負の左オペランドを使用した左シフト演算での未定義の動作

C のビット単位の左シフト演算 (<&lt ;) 左側のオペランドが負の値の場合、未定義の動作を呼び出します。これは ISO C99 (6.5.7/4) で規定されており、負の値 (符号付き型) を左シフトした結果が未定義であることを示します。</p><p><strong>C での未定義の動作の根拠</strong> </p><p>標準では、この未定義の動作の明確な理由が提供されていません。ただし、これは、特に 2 の補数表現における負の値の実装依存の動作を考慮すると、負の値を左にシフトする場合の一貫した予測可能な結果を​​定義することが難しいためであると推測できます。</p><p><strong> C の明確に定義された動作 </strong></p><p> C とは対照的に、C の左シフト演算 (ISO C -03) 5.8/2) は、結果を結果型で表現できる場合、符号付き型に対して未定義の動作を引き起こしません。この変更は、オペランドの符号に関係なく、左シフト演算の動作の一貫性を確保するために ISO C 委員会によって行われました。</p><p><strong>負の左オペランドを使用した右シフト演算の実装定義の動作</strong></p><p>左シフト演算とは異なり、右シフト演算 (<code >>>)左オペランドが負の場合、実装定義の動作を呼び出します。標準によると、これは、2 の補数表現における負の値に対する左からのビットの切り捨てが実装に依存するためです。

結論

未定義の理由C の負のオペランドを使用した左シフト演算の動作と C の明確に定義された動作は、主に負の値に対する一貫した結果を定義する複雑さに起因します。負のオペランドに対する右シフト演算の実装定義の動作は、2 の補数表現における左からのビットの切り捨てが実装固有であるという事実を反映しています。

以上が負の数の左シフトが C では未定義の動作であるのに、C では明確に定義されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。