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
相关产品推荐
相关产品推荐

