
如果只是想检查32位int型的乘法溢出,其实很简单。将结果存储在long long类型中,可以很容易地检测到溢出。例如:
Integer& Integer::operator *(Integer &a) { union { long long ll; long l[2]; } temp; temp.ll = (long long)value * a.value; if (temp.l[1] == 0 || temp.l[1] == -1) return Integer(temp.l[0]); else { cout << "Overflow" << endl; } }
这种做法可以避免复杂的条件判断,提高了程序的执行效率。
另外,直接将a和temp的符号进行比较,判断是否溢出的方法并不准确。例如:
if(a>0 == temp>0)
这里的a是从哪里来的?在前面已经判断过不会溢出了,下面的判断是多余的。
综上所述,更简洁且有效的判断方法是:
int temp = value + in.value; if ( (in.value>0) == (temp > value)) { return Integer(temp); } else { cout << "Overflow" << endl; return *this; }
这种判断方式不仅减少了代码量,而且提高了程序的运行速度。
此外,使用long long类型存储结果,可以轻松检测32位整数乘法的溢出情况,而无需复杂的条件判断。
总结来说,通过将结果存储在long long类型中,可以更简洁地判断32位int型的乘法是否溢出,同时提高程序的执行效率。