右シフト演算子の一貫性のない動作
右シフト (>>) 演算子は、シフト カウントは 32 以上です。この不一致は次の要因に基づいて発生します:
コンパイル時評価と実行時実行
提供されたコードでは、式 1 >> 32 と (int)1 >> (int)32 はコンパイル時に評価されるため、foo() 関数とは異なる結果が得られます。コンパイラは定数式を 0 に最適化しますが、foo() 関数は実行時に式を評価するため、未定義の動作が発生します。
C 標準の未定義の動作
整数をその幅以上の値だけシフトする動作は、C 98 標準に従って未定義です。したがって、コンパイラは式 1 >> を自由に解釈できます。
x86 アーキテクチャでのシフト数のマスキング
x86/x86-64 アーキテクチャでは、論理右シフト (SHR) は > として動作します。 ;> (b % 32) または >>; (b % 64) 64 ビット モード。このマスキングにより、シフト カウントが 5 または 6 ビットに制限され、結果として 0 ~ 31 (または 64 ビット モードでは 0 ~ 63) のシフトが行われます。
ARM アーキテクチャでのゼロ拡張
x86 とは対照的に、ARM アーキテクチャの論理右シフト (LSR) は、シフト中に整数をゼロで拡張します。この拡張機能は、32 以上のシフトがゼロを生成することを保証します。
移植性への影響
アーキテクチャ間で右シフト演算子の動作が一貫していないため、開発時に注意が必要です。移植性を目的としたコード。 32 ビット整数を 32 以上シフトすることは、未定義またはマシン依存の動作のため推奨されません。
以上が## シフト数が 32 以上になると右シフト演算子が一貫性のない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。