ホームページ >バックエンド開発 >C++ >「long long」変数を使用しても、整数リテラルを乗算するとオーバーフローが発生するのはなぜですか?

「long long」変数を使用しても、整数リテラルを乗算するとオーバーフローが発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-10 19:04:03875ブラウズ

Why Does Multiplying Integer Literals Result in Overflow Even with a `long long` Variable?

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 サイトの他の関連記事を参照してください。

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