C 算術演算における Long Long 整数のオーバーフローを理解する
次のコード スニペットを考えてみましょう。
long long int n = 2000 * 2000 * 2000 * 2000; // overflow
なぜこれが起こるのか結果を保持するために Long Long 変数を宣言しているにもかかわらず、コードの結果がオーバーフローになりますか?
オーバーフローの理由
問題は整数リテラルの型にありますデフォルトでは、整数リテラルには、int より小さくならずに値を保持できる最小の型が割り当てられます。 2000 は 32 ビット int に格納できるため、これらのリテラルの算術演算は int 演算として実行されます。
型昇格
ただし、n のようなlonglong変数は可能です。より大きな値を格納すると、乗算演算に存在するより大きな型を使用して算術演算子が呼び出されます。ただし、この場合、宛先の型に関係なく、大きい方の型は int のままです。
オーバーフローの影響
これは、乗算 2000 * 2000 の結果が返されることを意味します。 * 2000 * 2000 は 32 ビット整数として計算されますが、結果が int が保持できる最大値を超えるためオーバーフローします。
代替アプローチ
これを回避するにはオーバーフローの場合は、リテラル定数の LL 接尾辞または明示的なキャスト演算子 (long long) を使用して、整数リテラルを明示的に long long にキャストできます。
long long int n = (long long)2000 * 2000 * 2000 * 2000; // no overflow
あるいは、pow 関数を使用して結果を計算することもできます。 :
long long int n = pow(2000, 4); // no overflow
明示的にキャストまたは pow 関数を使用することにより、計算が Long Long 値で確実に実行され、オーバーフローが防止されます。
以上が「long long」変数を使用しても、整数リテラルを乗算するとオーバーフローが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。