ホームページ  >  記事  >  バックエンド開発  >  「long long int」代入で整数リテラルを乗算するとオーバーフローが発生するのはなぜですか?

「long long int」代入で整数リテラルを乗算するとオーバーフローが発生するのはなぜですか?

DDD
DDDオリジナル
2024-11-08 08:28:01495ブラウズ

Why Does Multiplying Integer Literals in a `long long int` Assignment Lead to Overflow?

Long Long Int 代入でのオーバーフロー: 整数リテラルの乗算が失敗する理由

提供されたコード スニペットでは、3 つの Long Long Int 代入が試行されています。

long long int n = 2000*2000*2000*2000; // overflow
long long int n = pow(2000,4); // works
long long int n = 16000000000000; // works

3 番目の割り当ては成功するのに、なぜlong long int を使用しているにもかかわらず、最初の 1 つはオーバーフローしますか?

整数型について

オーバーフローの原因は、整数型の性質にあります。デフォルトでは、整数リテラルには、int より小さくならずに値を表現できる最小の型が割り当てられます。この場合、2000 は int であり、通常、ほとんどのシステムで 32 ビットを占有します。

乗算ルール

乗算などの算術演算子は、関連する 2 つの型のうち大きいですが、int より小さくはありません。例:

  • char * char は、operator*(int,int) -> を呼び出します。 int
  • char * int は、operator*(int,int) -> を呼び出します。 int
  • long * int は、operator*(long,long) -> を呼び出します。 long

ただし、int * int は依然として Operator*(int,int) -> を呼び出します。 int.

型の昇格とオーバーフロー

オーバーフロー割り当てでは、2000*2000*2000*2000 に 4 つの int 値の乗算が含まれ、結果は int よりも大きな整数になります。保持できる。最終結果はlong long int変数に格納されていますが、乗算はintで行われます。

オーバーフローの解決

オーバーフローを回避するには、次のコードを使用できます。アプローチ:

  • long long int を表す 2000LL を明示的に使用します。リテラル。
  • pow(2000,4) を使用して double として計算を実行し、それを long long int 変数に代入します。
  • 16000000000000 などの大きな整数値を直接代入します。 Long Long int 変数に変換します。

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

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