C ++:隐式常量转换溢出[-Woverflow]

时间:2016-09-21 20:02:10

标签: c++ c++11

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

C ++ 中的上述代码给出错误:

  

隐式常量转换溢出[-Woverflow]

以下代码运行良好:

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

可能是什么问题?

3 个答案:

答案 0 :(得分:7)

问题是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的类似大数字时,您只是将问题推迟到以后。

答案 1 :(得分:5)

log2(10^18) ~ 59.80
log2(10^19) ~ 63.12

签名的long long很可能是64位,标志为1位保留,因此10 ^ 18非常适合,但10 ^ 19并不适合。

C ++标准还只保证最多2^63-1的数字可以存储在long long中。

pow也在浮点运算。结果不准确。因此,将其保存为整数可能是一个错误。

答案 2 :(得分:2)

long long max value仅为9223372036854 775 807 和pow(10,19)是更大的数字100000000000000000000