You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:54:03