我想将两个数字相乘,并检测是否有溢出。最简单的方法是什么?
发布于 2010-04-26 22:02:07
Pavel Shved解决方案的替代方案...
如果您选择的语言是汇编语言,那么您应该能够检查溢出标志。如果没有,您可以编写一个自定义汇编例程,在设置了溢出标志的情况下设置一个变量。
如果这是不可接受的,您可以找到两个值的最重要的设置位(绝对值)。如果和超过了整数(或无符号)中的位数,那么如果它们相乘,就会出现溢出。
希望这能有所帮助。
发布于 2014-05-26 08:42:48
在C语言中,下面是一些经过成熟优化的代码,可以处理各种特殊情况:
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
上述方法的好处是它不需要强制转换为更大的类型,因此该方法可以在更大的整数类型上工作。
https://stackoverflow.com/questions/2713972
复制相似问题