【发布时间】:2021-08-07 02:52:29
【问题描述】:
我正在做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 立即乘以在一行中计算结果相当于更新结果。
谁能解释为什么一个版本有效而另一个无效?
【问题讨论】:
-
将两个
ints 相乘得到int,即使你之后要考虑更大的东西。 -
无关:
pow(10,9)+7;涉及一些风险。这些天编译器非常聪明,可能会给你想要的东西,但如果不是这样,你可能会发现pow生成的数字类似于 999999999.999999,它将被截断为 999999999,而不是四舍五入到 1000000000。 -
查看这两个函数生成的汇编代码之间的differences。
-
你需要
(long)其中之一
标签: c++ multiplication integer-overflow