int類型運算溢出

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章