Ⅰ 關於整型數據的溢出問題
100000000000000表示是負數,所以答案要減1再取反。
011111111111111 //-1
100000000000000 //取反
最後將這個數變成十進制,然後加上負號。
Ⅱ c語言 整型數據溢出問題
int 型 佔4位元組(所佔位元組和編譯器有關的,此處所說的是在VC上,比如在TC或BC上佔2位元組)
有符號 int 范圍 -2^31~2^31-1
無符號 int 范圍 0~2^32-1
如果超出這個范圍就會溢出
Ⅲ 在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++進行整型數據溢出
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語言整形數據的溢出詳解,教科書上講的不理解,請高手們支支招
這涉及到整型數據在計算機硬體上的表示方式.
理論上,整數是無窮多個的.
但計算機的中央處理器上的加法器(這是cpu的核心)位數長度是有限的.
根據cpu位數的不同,常見的intel公司的cpu是32位(bit位,是二進制的表示),單片機常見是8bit的.
在軟體編譯器中,通常默認的整型數據類型,如:C語言的int類型,是跟目標機的位數相關的.
以8位機為例,其int類型長度=8bit,也就是最大無符號整數的最大值是B1111 1111=(十進制)255.
超過255,如256,在計算機內部的表示就會翻轉,也就是0.
Ⅵ 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語言)整型數據的溢出怎麼寫
這個是計算機中的負數補碼表示
假定有符號的最大值(二進制) 為0111...111 後面若干個1 當然 取決於計算機的位長度
增加1之後溢出的話 就成了 1000...000 這個時候符號位就變成了1 也就是會被判定為負數
然後再轉換成十進制自然就是負數了
Ⅷ 如何判斷整數數據的溢出
整數溢出,如何判斷整數溢出 收藏
C語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算里,沒有了符號位,所以是沒有溢出的概念的。
所有的無符號運算都是以2的n次方為模。如果算術運算符的一個操作數是有符號書,另一個是無符號數,那麼有符號數
會被轉換為無符號數(表示範圍小的總是被轉換為表示範圍大的),那麼溢出也不會發生。但是,當兩個操作數都是有符號數
時,溢出就有可能發生。而且溢出的結果是未定義的。當一個運算的結果發生溢出時,任何假設都是不安全的。
例如,假定a和b是兩個非負的整型變數(有符號),我們需要檢查a+b是否溢出,一種想當然的方式是:
if (a + b < 0)
溢出;
實際上,在現實世界裡,這並不能正常運行。當a+b確實發生溢出時,所有關於結果如何的假設均不可靠。比如,在某些
機器的cpu,加法運算將設置一個內部寄存器為四種狀態:正,負,零和溢出。在這種機器上,c編譯器完全有理由實現以上
的例子,使得a+b返回的不是負,而是這個內存寄存器的溢出狀態。顯然,if的判斷會失敗。
一種正確的方式是將a和b都強制轉換為無符號整數:
if ( (unsigned)a + (unsigned)b > INT_MAX)
溢出;
這里的int_max值為有符號整型的最大值。在一般的編譯器里是一個預定義的常量。ANSI C在limits里定義了INT_MAX,值為
2的31次方-1.
不需要用到無符號算數運算的另一種可行方法是:
if (a > INT_MAX - b )
溢出;
PS : 有符號數的最高位(31位)為符號位,最高位為0的時候,表示正,為1的時候表示負。運算時,符號位不參加運算,但是如果兩個數相加,30位需要進1時,那麼即表示溢出。
Ⅸ (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。