x86 上の GCC の整数オーバーフローを理解する
問題:
提供されたコードは、 x86 で整数オーバーフローを試みると GCC で無限ループが発生するアーキテクチャ:
int i = 0x10000000; while (i > 0) { i += i; }
理由:
x86 上の GCC での整数オーバーフローは未定義の動作であり、観察される動作は異なる可能性があります。 GCC は通常、オーバーフロー時にラップする x86 整数命令を使用して整数演算を実装します。ただし、この場合、コンパイラはオーバーフローが意図されていないものとみなし、無限ループを引き起こす最適化を実行します。
解決策:
ラップアラウンド動作を保証するには、明示的なオーバーフロー制御が必要です。これは、次の方法で実現できます。
代替実装:
コードの説明:
問題のあるループのアセンブリ コードでは、コンパイラーがオーバーフローが発生しないという仮定に基づいてループ テストを最適化していることがわかります。起こる。その結果、ループが無限に続きます。
以上がこの整数オーバーフロー コードが x86 上の GCC で無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。