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

C++ : overflow in implicit constant conversion [-Woverflow]

本文关键字:溢出 -Woverflow 常量 转换      更新时间:2023-10-16
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

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也操作浮点数。它的结果不会是精确的。因此,将其保存为整数很可能是一个错误。

long long的最大值只有9223372036854 775 807pow(10,19)是更大的数10000000000000000000