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

为何向vector<long long>赋值会触发int溢出?正确赋值方式?

关于C++ int溢出问题的解析与解决

为什么正常赋值会溢出?

m和n是int类型,所以m-1和n-1的结果也都是int。C++中,相同类型的操作数运算时,结果类型与操作数一致——也就是说这两个int相乘时,计算过程完全在int的取值范围内进行。

你的例子里,39999 * 91999 = 3679868001,而标准int的最大值是2147483647,这个乘积远超上限,触发有符号整数溢出(属于未定义行为,实际表现通常是补码截断),得到错误值-615099295。之后把这个错误值赋值给long long的out[0],自然也没法得到正确结果——溢出已经在乘法步骤发生了,赋值只是把错误值转存而已。

强制转换是正确的解决方式吗?

完全正确。只要在乘法前将任意一个操作数转为long long,C++的类型提升机制会自动把另一个操作数也升级为long long,整个乘法运算就会在long long的范围内执行,不会触发溢出。比如:

out[0] = static_cast<long long>(m-1) * (n-1);

或者更清晰的写法:

out[0] = static_cast<long long>(m) - 1;
out[0] *= (n-1);

两种写法都能保证计算过程不会出现int溢出。

如何避免int变量表达式的溢出问题?

  • 提前转换操作数:在可能溢出的运算前,将至少一个操作数转为更大的整数类型(如long long),确保运算在足够大的范围进行。
  • 用大类型存中间结果:如果表达式复杂,先把变量赋值给long long临时变量再计算,可读性更高:
    long long a = m - 1;
    long long b = n - 1;
    out[0] = a * b;
    
  • 开启编译警告:编译时启用溢出检测警告(比如GCC的-Woverflow,MSVC的/W4),让编译器提前帮你发现风险。
  • 直接使用大类型:如果业务中经常处理大数,干脆把变量直接声明为long long,从根源上避免这类问题。

内容的提问来源于stack exchange,提问作者Antact

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:59:59