首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在将两个2的补码整数相乘时检测溢出?

如何在将两个2的补码整数相乘时检测溢出?
EN

Stack Overflow用户
提问于 2010-04-26 21:53:16
回答 2查看 18.5K关注 0票数 20

我想将两个数字相乘,并检测是否有溢出。最简单的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2010-04-26 22:02:07

Pavel Shved解决方案的替代方案...

如果您选择的语言是汇编语言,那么您应该能够检查溢出标志。如果没有,您可以编写一个自定义汇编例程,在设置了溢出标志的情况下设置一个变量。

如果这是不可接受的,您可以找到两个值的最重要的设置位(绝对值)。如果和超过了整数(或无符号)中的位数,那么如果它们相乘,就会出现溢出。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2014-05-26 08:42:48

在C语言中,下面是一些经过成熟优化的代码,可以处理各种特殊情况:

代码语言:javascript
复制
int
would_mul_exceed_int(int a, int b) {
  int product_bits;

  if (a == 0 || b == 0 || a == 1 || b == 1) return (0); /* always okay */
  if (a == INT_MIN || b == INT_MIN) return (1); /* always underflow */

  a = ABS(a);
  b = ABS(b);

  product_bits  = significant_bits_uint((unsigned)a);
  product_bits += significant_bits_uint((unsigned)b);

  if (product_bits == BITS(int)) { /* cases where the more expensive test is required */
    return (a > INT_MAX / b); /* remember that IDIV and similar are very slow (dozens - hundreds of cycles) compared to bit shifts, adds */
  }
  return (product_bits > BITS(int));
}

Full example with test cases here

上述方法的好处是它不需要强制转换为更大的类型,因此该方法可以在更大的整数类型上工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2713972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档