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

C++中两个大整数相乘赋值给long变量溢出,为何需在右侧加(long)转换

问题核心原因

  • C++中不指定后缀的整数字面量,只要值在当前编译环境int的取值范围内,默认类型就是int。主流编译环境中32位int的取值上限为2^31 - 1 = 2147483647。
  • 运算符优先级规则里,算术运算符优先级远高于赋值运算符,所以代码执行时会先计算等号右侧的乘法表达式,再把结果赋值给左侧的变量。
  • 你示例中100000和90000都是int类型,两个int相乘的运算结果默认也是int类型。而100000 * 90000 = 9000000000远大于32位int的上限,所以在乘法运算阶段就已经发生了溢出,得到被截断的错误值之后才会赋值给左侧的long类型变量,此时左侧类型再大也无法修正已经溢出的结果。

你看到的警告给出的错误结果410065408,就是9000000000超出32位int取值范围后,高位被丢弃仅保留低32位得到的截断值。

强制转换的作用原理

当你把表达式写为(long)100000 * 90000时:

  • 强制转换运算符优先级高于乘法,会先把操作数100000从int转换为long类型
  • 执行乘法运算前会触发隐式类型提升:另一个int类型的操作数90000会自动提升为long类型再参与运算,整个乘法表达式的结果类型就是long,不会发生溢出,再赋值给左侧变量就是正确结果。

除了强制转换,你也可以直接给字面量加L后缀指定为long类型,效果完全一致:

long x = 100000L * 90000;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:27:02