c語言整型溢出
❶ 關於c語言整型數據的溢出問題~~求高手多指點~~
對於整數,反碼,補碼與原碼相同。
對於負數,補碼是原碼的符號位不變,數值部分按位取反再加1。
知道負數補碼,可以對改補備啟碼再一次求補碼,就可以得到原碼。
假設你是16位系統。
100000000000000
求補=1
11111111111111+1=00..00
b就溢出為0了。
不過現在都是32位系統了,int類型都是4個位元組的都,a表示成00..00100000000000000了。
樓主的的這個程序不能造成溢出。
所以printf
("%d",b);打仿隱如印出來的攜陸b應該是32768,也不是
-32768
❷ (c語言)整型數據的溢出
C語言的整型溢出,分為無符號整型溢出和有符號整型溢出。
對於unsigned整型溢出,C的規范是有定義的爛緩——「溢出後的數會以2^(8*sizeof(type))作模運算」,也就是說,如果一個unsigned
char(1字元,8bits)溢出了,會把溢出的值與256求模。如:
1.unsigned
char
x
=
0xff;
2.printf("%dn",
++x);
上面的代碼會輸出:0
(因為0xff
+
1是256,與2^8求模後就是0)
對於signed整型的溢出,C的規范定義是「undefined
behavior」,也就是說,編譯器愛怎麼實現就怎麼實現。如:
1.signed
char
x
=0x7f;
//註:0xff就是-1了,因為最高位是1也就是負數了
2.printf("%dn",
++x);
上面的代碼會輸出:-128,因為0x7f
+
0×01得到0×80,也就是二進嫌歷州制的1000
0000,符號位為1,負數,後面為全0,就是負的最小數,芹蔽即-128。
❸ 在C語言中,何為整型數的溢出位操作符和移位操作符又是什麼
所謂的溢出是超出所能表示的范圍了毀姿..比如說一個位元組能表棗歷示的最大個數是2^8 - 1,當然沒有算符號位..我們就按這種狀態下來舉例
溢出::::::
a = 11111111; 那a這個數已經把8位全部用1表示滿了,這時候b = 00000001夠小了吧,這個時候如果算c = a+b; 限定c只能用一個位元組表示,那加完之後就會出現溢出情況,a已經不能再加了,再加也不會比它能表示的最大的數大了..同樣的道理,C語言整數用幾個位元組表示跟CPU是多少位的也有關系的,當然也跟編譯的纖岩絕軟體有關系,超過整數所能表示的范圍就叫溢出...
位移:::::::
樓上的已經寫出來了...
❹ 在C語言中,何為整型數的溢出位操作符和移位操作符又是什麼
對於溢出上面的回答就行,補充一些,根據不同的機器(不同位寬)占的位寬也是不同的。不一定都是32。
另外關於溢出:
假如現在我的空間只有4位2進制(以下補碼和符號不考慮,工作起來都一樣)
也就是我只能表示0000到1111(也就是0-15)的數據
如果我現在已經存了1111這么樣一個數據,可是系統又要給它+1那麼他就會變成1111+1=>10000這時,最高位存不下會被丟棄.應該顯示16的時候卻變成了0,這時候我們就說他產生了溢出。32位也是一樣就是32個1那麼再+1就0了。
位操作符就是對該數據的二進制形式下的每一位分別進行操作使用的操作符就叫位操作符(組織語言能力差了點。。。。舉個例子吧~~)
首先還是剛剛的數據1111B(也就是15,B是什麼知道吧...)如果和1010B(也就是10)與運算(與或非知道吧。。。&& || !)那麼結果應該是個Bool的值為true(非0即真,兩個真就為真..)。
如果是用1111B和1010B進行位與運算(&)那麼結果應該是1010而不是1.這就是位運算..
移位操作符
就是移位嘛..>>和<<.一個左移一個右移.你就當成一個是乘2一個是除2就好了,位移就*或/幾次2.
❺ C語言中的int整型溢出是怎麼回事
從C語言的內部處理機制來如悶說,int型數超出范圍(溢出)被認為是一個正常現象,只會產生錯誤的計算結果或邏輯錯誤,而不會觸發數據溢出的異常。因此,為了避免因為整數溢出而產生程序邏輯或計算錯誤,程序員必須自行檢測可能渣滲彎出現的溢出或者確保不會出現數據溢出的情況。
C語言對於int類型數據超出范圍的處理,只有一個最簡單的原則:截斷處理,即超出int位長度范圍的高位元組被自動截掉。
比如,假設int長度為16位的情況下,以下代碼:
int
a=0X77FFFFL;
/*
由於超出范圍,高位的77將被自動截掉,實喊衫際的a將會等於0xFFFF
*/
++a;
/*
a自增後,將超出范圍,高位的1被截掉,實際a=0
*/
❻ c語言 整型數據溢出問題
int 型 佔4位元組(所佔位元組和編譯器有關的,此處所說的是在VC上,比如在TC或BC上佔2位元組)
有符號 int 范圍 -2^31~2^31-1
無符號 int 范圍 0~2^32-1
如果超出這個范圍就會溢出
❼ C語言關於整型數據溢出的問題
關於long型在計算機內存儲方式,參看:
http://..com/question/112869407.html
yyrryyrr2的回答
-----------------------------------------------------
printf("%d\n%ld",a,b);中
printf將"%d\n%ld",a及b依次壓入棧中
printf內部的可變參數分解函數從棧中取出數據替代%d,
依你的輸出結果你用的是16位編譯器。
棧從低地址到高地址數據為:
地址(假設) 數據
0xf000 0x3000(指含消差向("%d\n%ld")
0xf002 0x7fff(即32767)
0xf004 0x8000 (即32768)
0xf006 0x????(此處為main函數的局部變數)
那麼printf首先接受一個16位的int型,取出0x7fff調用_itoa將其轉化成數字字元並替換%d。
然後printf需要取出一個32位long型數據,從0xf004處,可是你只給入了一個16值,所以取出的32位值包含垃圾信息(有16位是main函數的局部變數或垃圾信息),是0x8000????形式,而實際上????處恰好包含了0x0000(這點從你第二個printf調用即可看出,後一堆垃圾數據是0x0000),所以最終輸出數字0x80000000即-2147483648
對後兩個printf的分析類似
第二個調用雖然傳入兩個可變參數,但是由於有3個%d,所以前兩個取出後,繼續從棧上取數據,取出了main的棧楨的數據0x0000
最後一個printf調用再取了更後面的數據。
--------------------------------------------------
樓主喜歡探究問題的根源。
你可以翻看我的網路回談皮答關於c/c++的回答,橋凱會令你受益匪淺
❽ 在C語言中,何為整型數的溢出位操作符和移位操作符又是什麼
整型溢出:
在整型數計算時,結果無法繼續正確存儲在整型變數中,即運算結果超出了整型數值所能表示的范圍。比如計算100的階乘等。溢出後的表現就是計算結果與期望值不符。
位操作符,是C語言中的一組操作符,包括
按位與&,按位或|,按位取反~,按位異或^,
左移<<,右移>>,以及在這六個操作符上擴展出的賦值符號,包括&=,|=,~=,^=,<<=,>>=等。
其中:
1
&為按位與操作,a&b結果的每位上,只有當a,b對應位上均為1時,才為1,否則結果位上為0。
2
|為按位或操作,只有a,b對應位上均為0,結果對應位上才為0;否則結果的該位上值為1。
3
~取反,為單目操作,只有一個操作數,當操作數的某位上值為1時,結果值為0;否則結果值為1。局喊
4
^異或操作,a,b對應位上相同時,結果位上值為0;否則值為1。
5
<<左移操作,a<<b的結果為,將a的各個位向左移動b位,左側b位拋棄,右側補b個0。
6
>>右移操作,a>>b的結果為,將a的各個位向右移動b位,右側b位拋棄,左側補b個兄臘森0或1。當a為無符號數,羨畝或正數時,左側補0;當a為有符號負數時,左側補1。
❾ (c語言)整型數據的溢出
其實這個問題很簡單的,這個可能和你編譯器環境有關,int 類型表示範圍是-32768-32767。所以你可以把它的表示範圍比作一個圓。因為在電腦中負數是按補碼保存的,所以加1之後會出現進位。如果是char 類型表示-128-127的話,那麼char a = 128也會變成-128的。
你可以看一下下面的圖,這個圓就好比表示的范圍。如果不信的話你可以將int a = 32769;試試的,輸出應該會變成-32787
❿ C語言整型溢出會怎樣
C語言的整型液臘腔溢出,鬧衫分為無符號整型溢出和有符號整局缺型溢出。
對於unsigned整型溢出,C的規范是有定義的——「溢出後的數會以2^(8*sizeof(type))作模運算」,也就是說,如果一個unsigned
char(1字元,8bits)溢出了,會把溢出的值與256求模。