隐式常量转换中的溢出[-Woverflow]
C++ : overflow in implicit constant conversion [-Woverflow]
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
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- 使用向量的缓冲区溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 如何修复此特征矩阵反演溢出错误?
- 隐式常量转换中的溢出[-Woverflow]