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

Barbara Streisand
リリース: 2024-11-10 19:04:03
オリジナル
821 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート