为什么LeetCode最大蛋糕面积题中间结果要先转long再强转int返回?
问题解答
核心原因是32位int类型的整数溢出
C++中主流编译器的32位int类型取值范围为 -2147483648 ~ 2147483647,也就是最大只能容纳约21亿的正整数。
这道题的输入参数h、w最高可达1e9量级,所以计算得到的最大横向间隔horizontal、最大纵向间隔vertical最高都能接近1e9:
- 如果你直接用两个
int值做乘法:两个1e9相乘的结果是1e18,远远超过int的最大取值范围,会触发有符号整数溢出。这在C++标准中属于未定义行为,会出现结果错误、运行时崩溃等异常,也就是你遇到的运行时错误。 - 代码里先转
long的逻辑:C++算术运算会自动把操作数提升到两个操作数中精度更高的类型,64位long类型的最大取值约为9e18,完全可以容纳两个1e9相乘的结果,只要把操作数强转成long再做乘法就不会溢出。后续做完两次取模运算后,结果已经小于MOD(100000007),远小于int的最大值,最后转回int就不会有任何问题。
内容的提问来源于stack exchange,提问作者Adarsh
相关产品推荐
相关产品推荐

