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

为何将结果存入大变量时仍需static_cast避免int运算溢出?

为什么int变量相乘溢出时,必须先强制转换为long long才能正确存储?

你遇到的问题核心是运算类型的优先级高于赋值类型,具体原因如下:

  • 直接相乘的问题根源
    当你计算m * k时,因为m和k都是int类型,C会严格按照int类型执行乘法运算。这个运算过程完全和后续要赋值的long long变量无关——哪怕最终要存到更大的类型里,乘法的计算已经在int的范围内完成了。一旦乘积超出int的表示上限,就会触发有符号整数溢出,这属于C标准定义的未定义行为,轻则得到错误结果,重则像你碰到的那样被UndefinedBehaviorSanitizer直接报错拦截。

  • 强制转换解决问题的原理
    当你用static_cast<long long>(m)把其中一个int变量转成long long后,C++的隐式类型提升规则会自动把另一个int变量也提升为long long类型,此时乘法运算会在long long的范围内执行。long long的存储空间更大(通常是64位),足以容纳你这两个数的乘积,自然不会出现溢出,结果也能正确赋值给long long变量。
    其实不用同时转换两个变量,只转其中一个就行,比如static_cast<long long>(m) * k,效果完全一样。

总结一下:乘法运算的类型由参与运算的操作数类型决定,和最终赋值的目标类型无关。必须先把操作数提升到足够容纳乘积的类型,才能避免运算过程中的溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:18:22