c語言為程式設計者提供了三種不同長度的整數:short int、int和long int,但不管是哪種型別表示的整數總有一定的範圍,越出該範圍時稱為整數的溢位。例如現有演算法要求如下:求滿足條件1+2+3+…+n≤32767的最大整數n,請考察如下程式段:
int n=1,sum=0;
while(sum<=32767)
printf(「n=%d\n」,n-1);
乍看該程式時無錯誤,但事實上,上列程式中的while迴圈是乙個無限迴圈,原因在於int型數的表示範圍為-32768到+32767,當累加和sum超過32767時,便向高位進製,而對int型數而言,最高位表示符號,故sum超過32767後便得到乙個負數,while條件當然滿足,從而形成無限迴圈。此時,最好的解決辦法是將sum定義為long int型。
另外google的一道筆試題中也需要意識到溢位的存在
short cal(short x)
答案x==0時,0x>0時,x+…+1x<0時,x+(x-1)+…+(-32768)【溢位】+32767+……+1,中途棧溢位假如是short型別的負數來說,-32768減去1之後,程式設計32767,就是說對於有符號整數來說,最小的負數-1=最大的整數,最大的整數+1=最小的負數。假如棧不溢位,那麼將遞迴32768-x+32767次,最後的值按照上面是可以計算出來的但是棧的空間有限,當棧溢位的時候,錯誤,強制退出。在gcc下,測試,假如上述資料型別是char,最後是能計算出值的大小,棧的大小還夠用上面提到的是有符號數的溢位,下面是無符號數的溢位在c語言的程式開發除錯中,經常碰到非法操作導致程式強行終止。這種情況的發生多是因為程式指標的指向錯誤,資料溢位就是其中的一種,下面我將介紹一下常見的幾種溢位情況。
1、無符號整數上溢
示例**:
bool funcb(char *s1,unsigned short int len1,char *s2,unsigned short int len2)
if (buf) free(buf);
return true;
} 這段**存在整數上溢問題,當len1等於64,len2是0xffff,這段**就會發生溢位。因為在定義為unsigned short char 型別下1+0xffff=0,這樣就繞過了1 + len1 + len2 > 64的條件判斷。直接導致後面的**中錯誤地分配64位元組記憶體,在記憶體拷貝時將產生溢位錯誤。 2、無符號整數下溢
示例**:
bool funca(unsigned int cbsize)
else
return false;
} 這是乙個整數下溢的例子。當函式呼叫時,如果引數cbsize賦值為0,由於引數cbsize被定義為unsigned int 型,則(cbsize-1)= (0-1) = 0xffffffff,分配如此大的記憶體,後果可想而知!
Python整數的溢位問題
只是牽線的理解,後續慢慢結束在繼續總結深層原因 在數學中整數時可以無限大的,但是在計算機中整數不可以無限大,在python2中用int表示整數,他的大小一般和你計算機的效能相關,用long表示長整數,一般代表無限大,後邊會有l來表示 當參與運算的數字或者運算結果超過計算機中最大的數,就會出現 整數溢...
unsigned整數相減溢位問題
平時工作中接觸到的整數都是無符號整數,很少有整數溢位的業務場景,最近遇到個整數溢位問題,故專門寫篇blog記錄下,本文不會 整數溢位背後的原理,是一篇總結溢位規律的文章,以4位元組整數為例,下unsigned整數相減溢位問題。直接擼 include int main 執行結果如下 a 0,b fff...
C 整數翻轉中的溢位問題
當輸入1234567899時會顯示,溢位錯誤提醒。在32位的程式設計環境中的int 型數字範圍是 231 231 1 231 2147483648,231 1 2147483647 而當翻轉後的數字在此範圍之外的時候,就會發生溢位。if x 10 it x 10 it int max else x ...