固然可以使用乙個更大範圍的數來儲存結果並判斷是否溢位,但如果已經是系統或語言支撐的最大整數型別了呢?
先給出結論:
對於無符號整數
運算型別
溢位型別
判斷沒有溢位
注意s=x+y
可能上溢
s≥x不能使用s-x==y來判斷
s=x-y
xx>=y
nam=x*y
可能上溢
(x==0&&m==0) || (x!=0&&m/x==y)
nam=x/y
不會溢位
1==1
na對於有符號整數
運算型別
溢位型別
如何判斷
注意s=x+y
可能上溢或下溢
!((x>=0&&y>=0&&s<0)||(x<0&&y<0&&s>=0))
nas=x-y
可能上溢或下溢
!((x<0&&y>0&&s>=0)||(x>0&&y<0&&s<=0))
nam=x*y
可能上溢
!x || m/x==y
nam=x/y
不會溢位
nana
無符號整數
我們要證明當s>=x時沒有溢位,先討論x、y的大小:如果x>=y,則s>=x會傳遞到s>=y,符合加法性質;如果x=min(x,y)時,依舊能判斷是否溢位;
使用反證法,我們假設當s>=x時有溢位,則溢位值s』=x+y-max,有x+y-max>=x,有y>=max,當取等號時,y=max,x=0,s』=0時,沒有溢位但是還是有s>=x,與假設矛盾;如果取大於號,顯然與定義矛盾,從而得證。
再證明使用s-x==y不能判斷是否溢位,我們這裡取3位無符號整數,max=8,x=4,y=5,則s=x+y-max=1發生溢位,但s-x=-3在無符號是5 == y。
如何判斷整型算數運算是否溢位
乙個算術運算溢位,是指完整的整數結果不能放到資料型別的字長限制中去。溢位的原因是顯而易見的,考慮兩個非負整數x和y,滿足0 x,y 2 w 1。xy可以被表示為w位無符號數字,然而考慮它們的和的話,我們可以得到0 x y 2 w 1 2。這個和需要w 1位來表示。如果我們再用其他數加上這個結果的話,...
整數溢位,如何判斷整數溢位
c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...
整數溢位,如何判斷整數溢位
c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...