C語言中的整數溢位

2022-10-11 13:42:12 字數 1758 閱讀 4319

對於初學者來說,

c語言的整數溢位可能一開始可能會不好理解。對於乙個位元組的 unsignde char型別和signed char 型別。賦值乙個超出其儲存範圍的數值時,

其真實儲存的數值並不等於我們賦值的資料。要弄清整數溢位問題,首先必須清晰計算機中數值都是以補碼形式儲存的,要會原碼、反碼和補碼的轉換。

下面分有符整數溢位和無符整數溢位分析。

一、有符整型溢位

比如下面這個程式,輸出不是129而是-127。

我們知道對於有符整型(signed char)它的儲存範圍為[-128,127],129已經超出向上溢位了。129的機器碼為【1000 0001】,計算機會取這八位作為補碼儲存。

補碼【1000 0001】是個負數,求其原碼減少1再對數值位取反可得到其原碼為【1111 1111】,這個值就是-127(最高位為符號位1,代表負數)。也可以把[-128,127]

看作汽車里程表,當向上超出時就重新從起點開始。129-127 = 2,從新從-128開始這個值就是-(128-2+1) = -127。

再舉乙個列子,下面這個程式輸出的結果為-112而不是400,同樣的分析可得出結果。

400的機器碼為【0000 0001 1001 0000】(2^8+2^7+2^4),計算機會取出低八位【1001 0000】作為補碼進行儲存,作為補碼這明顯是個負數,我們減1再對數值位取反可以得到其原碼

為【1111 0000】,這個數是-112(2^6+2^5+2^4)。用迴圈思想也可以驗證, 400超出上限400-127 -256 = 17,所以為-【128-17+1】 =  -112。一般我們在將int型資料賦給char型變數的時候

編譯器也會發出警告如下:warning: overflow in conversion from 'int' to 'signed char' changes value from '400' to '-112' [-woverflow]|。

二、無符整型溢位

無符整型溢位就簡單多了,因為正數的補碼和原碼一致。道理也是一樣的,這裡舉乙個簡單例子分析一下。下面的程式輸出結果不是288,而是32。

我們知道unsigned char乙個位元組儲存值的範圍是[0,255],288明顯已經向上溢位了。288的機器碼為【0000 0001 0010 0000】(2^8+2^5),計算機取出低八位【0010 0000】作為補碼

,正數補碼就是原碼,這個數就是32,迴圈思想也可驗證。同樣的編譯器也會發出相關警告:warning: unsigned conversion from 'int' to 'unsigned char' changes value from '288' to '32' [-woverflow]|

整型溢位問題,只要對於計算機數值儲存形式(補碼)和補碼原碼轉換有了解就不難理解了。

c語言中整數溢位的概念

在編寫程式時,如果整數的值太大,超出了所定義的整數型別的範圍會怎麼樣?下面分別將有符號型別好無符號型別整數設定為最大允許值加略大一些的值,看一看結果是是什麼。printf函式使用 u說明符顯示unsigned int型別的值 程式段上面所設定的整形和無符號整形均為系統所允許的最大值,下面即是執行的結...

C語言中 有符號數 無符號數 整數溢位

c語言中存在兩種整數算術運算,有符號型和無符號型。無符號數運算 所有無符號數運算都是以2的n次方為模,n是結果中的位數 所以它不存在運算時的沒有那種所謂的 溢位 當它超過範圍時,從零開始重新計數!當乙個無符號數和有符號數相加的時候,有符號數會自動轉化為無符號數參與運算!有符號數運算 是可能發生 溢位...

C語言中 有符號數 無符號數 整數溢位

includevoid main 這個的結果134,而不是我之前認為的很大的正數,實際上需要注意的是 1 0xffffffff 被提公升為unsigned int後是乙個差1就溢位的unsigned int,所以相加後結果是134。但是如果l 10000,那麼結果就真是乙個很大的正數了,因為不涉及溢...