ホームページ >バックエンド開発 >C++ >C で (1 >> 32) が 1 を返すのはなぜですか : 右シフト演算子の動作と未定義の動作についての詳細

C で (1 >> 32) が 1 を返すのはなぜですか : 右シフト演算子の動作と未定義の動作についての詳細

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 13:48:01759ブラウズ

Why Does (1 >> 32) C で 1 を返す : 右シフト演算子の動作と未定義の動作について詳しく説明します。 
> 32) C で 1 を返す : 右シフト演算子の動作と未定義の動作について詳しく説明します。 " />

右シフト演算子 (1 >> 32) に関する疑問

で右シフト演算子 (>>) を使用する場合C コードでは、オペランドの幅以上の値をシフトすると結果が 0 になると想定されることがよくありますが、提供されているコード スニペットに示されているように、この想定は予期しない動作を引き起こす可能性があります。

。関数 foo(a, b) は、整数 a を b ビットだけシフトします。引数 (1, 32) を指定して呼び出すと、予想される 0 ではなく 1 が返されます。この動作は、コンパイラが定数式 1 >> を処理することに起因します。コンパイル時には 32 になりますが、C 標準で説明されている未定義の動作により 0 と評価されます。

対照的に、bar(a, b) 関数は 64 ビット符号なし整数で動作し、正しく返されます。 32 ビットでシフトすると 0。これは、64 が 32 より大きく、シフトによって 0 が生成されることが保証されているためです。ただし、bar の場合でも、64 ビットでシフトすると 1 が返される可能性があります。

この動作をさらに説明すると、シフト操作のハードウェア実装は、シフト カウントを 5 または 6 ビット (アーキテクチャに応じて) にマスクし、32 または 63 以上のシフト カウントを効果的に切り捨てます。 したがって、特定のアーキテクチャの論理右シフト (LSR) により、 ≥32 のシフトは常に 0 を生成します。

これは、基礎となるハードウェア実装によって結果が異なる可能性があるため、32 ビット整数を ≥32 シフトすることの移植性のない性質を強調しています。

以上がC で (1 >> 32) が 1 を返すのはなぜですか : 右シフト演算子の動作と未定義の動作についての詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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