「long long」変数に代入する場合でも、整数リテラル定数の乗算がオーバーフローするのはなぜですか?

Barbara Streisand
リリース: 2024-11-11 06:08:02
オリジナル
664 人が閲覧しました

Why does multiplying integer literal constants overflow even when assigning to a `long long` variable?

Long Long 乗算のオーバーフロー

次のコードを考えてみましょう。

long long int n = 2000*2000*2000*2000;    // overflow
ログイン後にコピー

このコードでオーバーフローが発生するのはなぜですか整数リテラル定数を乗算し、結果をlong longに代入する場合変数?

動作する以下との比較:

long long int n = pow(2000,4);            // works
long long int n = 16000000000000;         // works
ログイン後にコピー

C の整数リテラルには、その値に応じたデフォルトの型があります。この場合、2000 は通常 32 ビット型である int 変数に収まります。

算術演算はオペランドのより大きな型で実行されますが、int よりも小さくはありません。したがって、最初のケースでは、乗算は int*int として実行され、int の結果が得られます。

この問題は、int の結果がオーバーフローする可能性があるために発生しますが、コードはそれを long long 変数に格納しようとします。 。 C は宛先に基づいて型を推論しないため、代入によってオーバーフローが防止されません。

この問題を回避するには、整数リテラルを乗算する前に明示的に Long Long にキャストできます。

long long int n = (long long int)2000*2000*2000*2000;
ログイン後にコピー

以上が「long long」変数に代入する場合でも、整数リテラル定数の乗算がオーバーフローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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