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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 20:13:17978ブラウズ

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

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

ISO C99 標準によれば、ビット単位の左シフト演算 (<< ) 左オペランドが負の値の場合、未定義の動作を呼び出します。これは、左オペランドの型が符号付きで負でない値の場合、結果は左オペランドと 2 のシフト量の積を、表現可能な最大値より 1 を余剰として減算したものになることが標準で義務付けられているためです。結果の型に。それ以外の場合、動作は未定義です。

C の明確に定義された動作

C とは対照的に、C は、負の左オペランドを使用した左シフト演算に対して明確に定義された動作を保証します。 。 ISO C -03 標準では、結果が左オペランドに 2 のシフト量乗算を掛けて、表現可能な最大値に 1 を加えたモジュロで減算されたものであると指定されています。この明確に定義された動作により、負の値をシフトする場合でも予測可能な結果が得られます。

C の明確に定義された動作の正当性

動作を定義する ISO C 委員会の決定負の左オペランドを使用した左シフトの場合は、ビット操作や整数などのさまざまなシナリオで予測可能な結果を​​求めることが原因と考えられます。 arithmetic.

負の左オペランドを使用した実装定義の右シフト

負の左オペランドを使用したビット単位の右シフト演算 (>>) は実装定義です。これは、その動作が標準で指定されておらず、コンパイラ実装者の裁量に任されていることを意味します。通常、これはターゲット プラットフォームと特定のコンパイラ実装によって異なります。

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

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