【问题标题】:Integer overflow on equivalent expressions?等效表达式的整数溢出?
【发布时间】:2021-08-07 02:52:29
【问题描述】:

我正在做leetcode 问题,当我以某种方式计算两个大数的乘法时出现溢出,但当我用对我来说似乎是完全等效的代码进行计算时没有溢出。

maxDiffHmaxDiffV 都是非常大的整数。而问题的答案是由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;

我认为通过将maxDiffHmaxDiffV 立即乘以在一行中计算结果相当于更新结果。

谁能解释为什么一个版本有效而​​另一个无效?

【问题讨论】:

  • 将两个ints 相乘得到int,即使你之后要考虑更大的东西。
  • 无关:pow(10,9)+7; 涉及一些风险。这些天编译器非常聪明,可能会给你想要的东西,但如果不是这样,你可能会发现pow 生成的数字类似于 999999999.999999,它将被截断为 999999999,而不是四舍五入到 1000000000。
  • 查看这两个函数生成的汇编代码之间的differences
  • 你需要(long)其中之一

标签: c++ multiplication integer-overflow


【解决方案1】:

感谢 cmets 中的每一个人。

这个问题的简单答案(正如 cmets 中提到的)是,在第一个版本中,我将一对 int 变量相乘,编译器在分配之前尝试将该计算存储(不成功)为 int它到我的变量result

第二种情况,相当于将 maxDiffH 类型转换为 long 并将其存储在 result 中,以便稍后将 long 与 int 相乘,该 int 在更新我的变量之前临时存储为 long。

我希望对像我这样的新手有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多