① 整形變數溢出問題
你的printf語句寫的不完整啊,有2個%d,後面就應該還有兩個整型變數才行啊.你以為計算機程序是神,可以知道你想輸出的是a,b啊
② 如何檢測整型相加溢出
對於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語言整形數據溢出怎麼辦
C語言的強大之處就在於他的靈活性,程序員自己把握。編譯器可以幫助預防錯誤,版但有些程序會權利用溢出,所以溢出不完全是錯誤的事情。
1、溢出:
數據類型超過了計算機字長的界限而出現的數據溢出;
2、溢出可能原因:
當應用程序讀取用戶數據,復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時 (假設定義數組int Array[10], 而在調用時使用Array[11] 或存放的數據超過int類型容量等), 內存緩沖區就可能會溢出.
3、溢出因素分析:
由於C/C++語言所固有的缺陷,既不檢查數組邊界,又不檢查類型可靠性,且用C/C++語言開發的程序由於目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,只要合理編碼,C/C++應用程序在執行效率上必然優於其它高級語言。然而,C/C++語言導致內存溢出問題的可能性也要大許多。
④ C++整型計算如何知道是否溢出
就目前講是沒有好辦法的
唯一辦法就是引入大整數庫來進行判定
⑤ 關於整型數據的溢出問題
100000000000000表示是負數,所以答案要減1再取反。
011111111111111 //-1
100000000000000 //取反
最後將這個數變成十進制,然後加上負號。
⑥ c語言 有符號整形a和b,如何判斷a+b是否溢出
簡單,我一說你就明白
如果一正一負
相加肯定不會溢出
如果是
2正
,那麼我們拿溢出閾值(2^31-1)
減去
a
然後和b比較
如果
b大,那麼a+b會溢出
如果是2負數你也應該會了吧
⑦ 如何判斷整數數據的溢出
整數溢出,如何判斷整數溢出 收藏
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++中的整數溢出
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或java當中的int型,使用32位,4個位元組存儲,有回符號位。其能存儲2^答32種不同數據。可存儲的數據在-2^31~2^31-1這個范圍內,超出則范圍則溢出。
若使用不帶符號位,則范圍為0~2^32-1。
用更加簡單的例子,如果使用4位來存儲,只能存儲2^4=16種不同數據。如果不帶符號位,則存儲范圍為0~15,超出則溢出。如果帶符號位,則范圍為-8~7,超出則溢出。
在實際編程中,某些編譯器會在特定情況下提示溢出問題,但更多情況需要自己處理溢出問題。
有什麼具體需求可以在追問中提出。