我正在做leetcode问题,当我以某种方式计算两个大数的乘法时,我得到了溢出,但当我在我看来完全等价的代码中计算它时,没有溢出。
maxDiffH和maxDiffV都是非常大的整数。问题的答案是由7+(10^9)修改的这两个整数的乘法。
这段代码在乘法行处失败,并显示以下消息:
Line 60: Char 32: runtime error: signed integer overflow: 999999998 * 999999998 cannot be represented in type 'int' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:69:32
long mod = pow(10,9)+7;
long result = maxDiffV *maxDiffH;
result = result % mod;
return result;虽然另一段代码运行良好
long result = maxDiffH;
result *= maxDiffV;
long div = 1e9+7;
result = result%div;
return result;我认为通过立即将maxDiffH和maxDiffV相乘在一行中计算结果将等同于更新结果。
有人能解释一下为什么一个版本可以工作而另一个版本不行吗?
发布于 2021-08-08 01:19:31
感谢评论中的每一个人。
这个问题的简单答案(正如注释中提到的)是,在第一个版本中,我将一对int变量相乘,编译器在将计算结果赋给我的变量result之前,尝试将其存储为int值(但未成功)。
第二种情况,相当于将maxDiffH类型转换为长整型并将其存储在result中,然后将长整型与int相乘,在更新变量之前将其临时存储为长整型。
我希望这对像我这样的新手有帮助:)
https://stackoverflow.com/questions/68689049
复制相似问题