有一种方法来确定操作是否可能溢出,使用操作数中最高有效一位的位置和一些基本的二进制数学知识。
对于加法,任何两个操作数将导致(最多)比最大操作数的最高一位多一位。例如:
bool addition_is_safe(uint32_t a, uint32_t b) {
size_t a_bits=highestOneBitPosition(a), b_bits=highestOneBitPosition(b);
return (a_bits<32 && b_bits<32);
}
对于乘法,任何两个操作数将导致(至多)操作数的位的总和。例如:
bool multiplication_is_safe(uint32_t a, uint32_t b) {
size_t a_bits=highestOneBitPosition(a), b_bits=highestOneBitPosition(b);
return (a_bits+b_bits<=32);
}
类似地,您可以估计a的结果的最大大小为b的幂,如下所示:
bool exponentiation_is_safe(uint32_t a, uint32_t b) {
size_t a_bits=highestOneBitPosition(a);
return (a_bits*b<=32);
}
(当然,请替换目标整数的位数。)
我不确定最快的方法来确定最高一位在一个数字的位置,这里是一个强力的方法:
size_t highestOneBitPosition(uint32_t a) {
size_t bits=0;
while (a!=0) {
++bits;
a>>=1;
};
return bits;
}
这不是完美的,但是这将给你一个好主意,是否任何两个数字可能溢出,在你做操作之前。我不知道它是否会比按照你建议的方式简单地检查结果更快,因为在highestOneBitPosition函数中的循环,但它可能(特别是如果你知道在操作数中预先有多少位)。