C で 200020002000 * 2000 がオーバーフローを引き起こすのに、pow(2000, 4) や直接代入が起こらないのはなぜですか?

Patricia Arquette
リリース: 2024-11-09 19:03:02
オリジナル
755 人が閲覧しました

Why Does 200020002000 * 2000 Cause Overflow in C   But Not pow(2000, 4) or Direct Assignment?

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

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