1. ホーム
  2. c++

[解決済み] C++ : 暗黙の定数変換でオーバーフローが発生する [-Woverflow].

2022-02-14 12:56:29

質問

long long sum;
sum=pow(10,19);
cout<<sum;

上記のコードを C++ がエラーになります。

暗黙の定数変換でオーバーフローが発生 [-Woverflow] 。

以下のコードは正常に動作しています。

long long sum;
sum=pow(10,18);
cout<<sum;

何が問題なのでしょうか?

解決方法は?

問題は long long の結果を保持するには小さすぎます。 pow(10,19) .

long long は通常64ビットで、64ビットの整数は約1.8*10^19種類の値を保持することができます。しかし、符号付きなので、その半分しか得られない(残りの半分は負の値用)。そして、その半分は0.9*10^19で、10^19より小さいらしい。

ここでのもう一つの問題(ただし警告/オーバーフローの理由ではない)は pow() 関数は浮動小数点値を返します。そのため、たとえ結果が long long - この場合、精度が落ちて正確な整数の結果が得られない可能性があります。

編集:もちろん unsigned long long の代わりに、このような場合です。10^19の場合はそれで十分ですが、10^20の場合はそうはいきません。ということは、この問題を、後日 unsigned long long .