整数オーバーフロー: 乗算が惨事につながる場合
C では、潜在的なオーバーフローを回避するために整数のサイズと型を理解することが不可欠です。次のコード スニペットを調べてみましょう:
long long int n = 2000*2000*2000*2000; // overflow long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
他の 2 行は問題なく動作するのに、なぜ最初の行はオーバーフローを引き起こすのでしょうか?
原因は C による整数リテラルの処理方法にあり、算術演算。デフォルトでは、整数リテラルは、値を保持できる最小の型ですが、int より小さくはありません。この場合、2000 は int で、通常は 32 ビット型です。
算術演算を実行するとき、コンパイラはオペランドの型に基づいた特定の規則に従います。このシナリオでは、乗算は関係する型のうち大きい方の int を使用して行われます。ただし、C は宛先に基づいて型を推論しないため、代入は無関係です。
int の容量を超える乗算の結果は int として格納され、オーバーフローが発生します。最初の行ではオーバーフローが発生するのに、他の 2 行ではオーバーフローが発生しないのはこのためです。
この問題を解決するには、サフィックス LL (または ll) を追加することで、最初の行で使用される定数の型を明示的に指定できます。 )。これにより、リテラルが long long int として扱われるようになり、オーバーフローが防止されます。
C で整数型と算術演算がどのように機能するかを理解することで、潜在的な落とし穴を回避し、コードでデータ操作を正しく処理できるようになります。
以上がC で整数の乗算がオーバーフローを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。