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