判斷乘法溢出
判斷乘法溢出
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;} }。這種做法可以避免復(fù)雜的條件判斷,提高了程序的執(zhí)行效率。另外,直接將a和temp的符號(hào)進(jìn)行比較,判斷是否溢出的方法并不準(zhǔn)確。例如。if(a>;0 == temp>;0)。
導(dǎo)讀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;} }。這種做法可以避免復(fù)雜的條件判斷,提高了程序的執(zhí)行效率。另外,直接將a和temp的符號(hào)進(jìn)行比較,判斷是否溢出的方法并不準(zhǔn)確。例如。if(a>;0 == temp>;0)。
如果只是想檢查32位int型的乘法溢出,其實(shí)很簡(jiǎn)單。將結(jié)果存儲(chǔ)在long long類型中,可以很容易地檢測(cè)到溢出。例如: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; } }這種做法可以避免復(fù)雜的條件判斷,提高了程序的執(zhí)行效率。另外,直接將a和temp的符號(hào)進(jìn)行比較,判斷是否溢出的方法并不準(zhǔn)確。例如:if(a>0 == temp>0)這里的a是從哪里來(lái)的?在前面已經(jīng)判斷過不會(huì)溢出了,下面的判斷是多余的。綜上所述,更簡(jiǎn)潔且有效的判斷方法是:int temp = value + in.value; if ( (in.value>0) == (temp > value)) { return Integer(temp); } else { cout << "Overflow" << endl; return *this; }這種判斷方式不僅減少了代碼量,而且提高了程序的運(yùn)行速度。此外,使用long long類型存儲(chǔ)結(jié)果,可以輕松檢測(cè)32位整數(shù)乘法的溢出情況,而無(wú)需復(fù)雜的條件判斷。總結(jié)來(lái)說,通過將結(jié)果存儲(chǔ)在long long類型中,可以更簡(jiǎn)潔地判斷32位int型的乘法是否溢出,同時(shí)提高程序的執(zhí)行效率。
判斷乘法溢出
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;} }。這種做法可以避免復(fù)雜的條件判斷,提高了程序的執(zhí)行效率。另外,直接將a和temp的符號(hào)進(jìn)行比較,判斷是否溢出的方法并不準(zhǔn)確。例如。if(a>;0 == temp>;0)。
為你推薦