int類型運算溢出
在二分查找代碼中有:
mid=(low+high)/2
會莫名導致溢出,查找原因;
C語言在進行二元運算時,會把較低的類型提升爲較高的類型,運算結果爲較高的類型;
C語言中對運算中類型提升的描述爲:
其中需要注意的一點是,運算結果類型與轉換後的類型相同,這樣導致兩個int類型數相加,其結果也是int類型,可能導致溢出.
做了個測試:
char a=127;
char b=100;
int c=2147483647;
int d=c/2;
cout<<a+b<<endl;//輸出227
cout<<c+d<<endl;//輸出-1073741826
cout<<(c+d)/2<<endl;//輸出-536870913
- 與預想中的不一樣,這裏char類型的運算似乎沒有溢出,而int類型運算會溢出.
在書中有這一段話,
大致意思是,在整形運算時,若原始類型中所有數可以用int表示,就會統一提升爲int類型;
也就是說,char類型在計算時會統一變爲int類型,short也是這樣.
總結
C語言中兩個int類型運算時,結果也是int類型,可能產生溢出.
因此,如果表達式的結果範圍大於int,而表達式中所有變量都能用int表示時,需要將變量強制轉化爲更大的類型以存儲可能溢出的結果。
因此,在二分查找程序中,一般這樣寫:
mid=low+(high-low)/2