C で 200020002000*2000 がオーバーフローを引き起こす理由
の値を代入する場合200020002000*2000をlonglong変数にするとオーバーフローが発生します。ただし、pow(2000,4) を使用するか、long long int に 16000000000000 を直接代入しても、オーバーフローは発生しません。
オーバーフローの理由
整数リテラル 2000デフォルトでは暗黙的に int 型にキャストされます。これは通常、 32ビット。算術演算子は常に、引数を存在する型のうち大きい方に拡張しますが、int より小さいことはありません。したがって、この場合、乗算は int*int として実行され、int の結果が生成されます。
オーバーフローと非オーバーフローのシナリオ
2 番目のシナリオ、 pow(2000,4) が使用されている場合、 pow 関数は引数を double にプロモートし、double 値を返します。これにより、計算中にオーバーフローが発生しないことが保証されます。
3 番目のシナリオでは、16000000000000 が Long Long int に直接割り当てられており、リテラルは暗黙的に Long Long にキャストできるほど十分に大きいです。したがって、代入は問題なく実行されます。
解決策
最初のシナリオでのオーバーフローを防ぐには、LL サフィックスを使用して整数リテラルを明示的に long long にキャストする必要があります。
long long n = 2000LL*2000LL*2000LL*2000LL;
以上がC で 200020002000 * 2000 がオーバーフローを引き起こすのに、pow(2000, 4) や直接代入が起こらないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。