C++乘法运算添加1LL转换仍出现integer overflow问题求助
问题根源分析
- 第一行输出溢出属于预期结果:两个32位
int类型变量相乘,运算结果默认仍为int类型,10^10远大于32位有符号int的最大值2147483647,发生截断后输出1410065408。 - 第二行仍然溢出的核心原因是当前编译环境中
long int为32位长度:32位有符号long int的取值范围和int完全一致,同样无法容纳10^10的计算结果,哪怕你通过1LL把运算过程的类型提升,最终赋值给32位long int类型的变量时还是会发生溢出截断。 - 补充说明:C++标准中有符号整型溢出属于未定义行为,不同编译器、不同编译选项下的运行结果可能存在差异,不要依赖溢出后的截断表现编写业务代码。
修复方案
- 方案1:将变量
c的类型改为long long,C++标准规定long long至少为64位,最大值至少为9223372036854775807,完全可以容纳10^10的结果,修改后代码如下:
#include <bits/stdc++.h> using namespace std; int main(){ int a = 100000; int b = 100000; cout << a * b << endl; long long c = a * 1LL * b; cout << c; return 0; }
- 方案2:如果需要保留
long int类型,可以切换到64位编译环境运行代码,多数64位系统中long int会被分配为64位长度,也可以得到正确结果。 - 验证方法:可以在代码中加入
cout << sizeof(long int) << endl;打印当前环境下long int的字节数,若输出为4即可验证上述结论。
内容的提问来源于stack exchange,提问作者Siddharth Mitra
相关产品推荐
相关产品推荐

