long long sum;
sum=pow(10,19);
cout<<sum;
C ++ 中的上述代码给出错误:
隐式常量转换溢出[-Woverflow]
以下代码运行良好:
long long sum;
sum=pow(10,18);
cout<<sum;
可能是什么问题?
答案 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