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 より小さくはありません。例:
ただし、int * int は依然として Operator*(int,int) -> を呼び出します。 int.
型の昇格とオーバーフロー
オーバーフロー割り当てでは、2000*2000*2000*2000 に 4 つの int 値の乗算が含まれ、結果は int よりも大きな整数になります。保持できる。最終結果はlong long int変数に格納されていますが、乗算はintで行われます。
オーバーフローの解決
オーバーフローを回避するには、次のコードを使用できます。アプローチ:
以上が「long long int」代入で整数リテラルを乗算するとオーバーフローが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。