语言余一个负数_C语言学习日记(8)——整数溢出
小時候喜歡玩電子計算器,覺得很神奇,想要算什么數(shù),立刻就能算出來。當時看著計算器的液晶屏幕就想,如果算一個很大的數(shù),超過了屏幕上面數(shù)字的位數(shù),會怎么樣呢?試了以后結(jié)果是INF,那就是無窮大了。雖然當時還小,但好像也知道那是電子計算器位數(shù)不足,從此覺得計算機雖然神奇,但計算能力也是有限的。
同樣,計算機雖然計算能力強大,但計算能力也受位數(shù)的限制,并不是無窮的。以int類型為例,當我們定義一個int類型變量時,它的位數(shù)為32位,4個字節(jié)。
int n;//定義了一個整型變量,占4個字節(jié)在C語言中,整型變量分為帶符號和不帶符號兩種。int其實是signed int的簡寫,也就是帶符號的。它保存的整數(shù)是有上下限的,最大為2147483647(21億多),最小為-2147483648。
如果計算結(jié)果超出了int類型變量的上下限,會怎么樣呢?我們來定義一個整型變量,并且將它初始化為最大值,然后再加1,看看會發(fā)生什么現(xiàn)象?
int n = 2147483647;//定義一個整型變量,并初始化為最大值n++; //n現(xiàn)在是多少呢?答案是-2147483648。很奇怪啊,一個正數(shù)加1竟然變成了負數(shù)。再仔細看看,這個負數(shù)就是int類型的最小值,也就是說在int類型的最大值上加1,就變到了最小值。所以老祖宗說物極必反嘛。
怎么理解呢?由于int類型的最大值為2147483647,最小值為-2147483648,那么對于它來說,這兩個數(shù)就相當于正無窮大和負無窮大,我們可以想象一條數(shù)軸,本來是一條直線,我們將這條直線兩頭接到一起,形成一個圓。那么正無窮大加1就來到了負無窮大,負無窮大減1就來到了正無窮大。這種現(xiàn)象就叫做整數(shù)溢出。
如果發(fā)生整數(shù)溢出,計算結(jié)果就不可靠。我們在計算的時候要選取合適的數(shù)據(jù)類型,確保能夠裝得下計算結(jié)果,不發(fā)生溢出。如果計算結(jié)果是正數(shù),但是超過了int的上限,我們可以考慮上限更大的unsigned int來保存,由于不用表示負數(shù),unsigned int表示正數(shù)的上限是int的兩倍。
如果定義一個unsigned int型變量,并初始化為它的最大值,然后加1,會變成多少呢?顯然會變成0。我們寫一小段代碼試一下:
#include #include #include //包含這個頭文件,不寫好像也沒問題int main(){ unsigned int n = UINT_MAX; //宏定義,表示 unsigned int的最大值 n++; printf("%u",n); //輸出unsigned int類型要用%u轉(zhuǎn)換說明符 system("pause"); return 0;}運行結(jié)果
代碼里的UINT_MAX是一個宏定義,定義在limits.h這個文件內(nèi)。前面小貓所寫的上下限都是在這個文件內(nèi)看到的。下面這幾行是從limits.h中截取的。
#define INT_MIN (-2147483647 - 1) #define INT_MAX 2147483647#define UINT_MAX 0xffffffffU以后我們就用INT_MAX,INT_MIN來表示int型變量的上下限,這樣方便多了。
整數(shù)溢出會帶來一個麻煩,那就是C語言中的時間。前面小貓已經(jīng)知道在64位系統(tǒng)中,time_t類型實際上是long long類型,long long類型上限為9223372036854775807,這是個非常大的數(shù)字,不用太擔(dān)心。但在32位系統(tǒng)中,time_t類型實際上是long類型,只占4個字節(jié),上限和int一樣,也就是21億多,如果達到了最大值,時間就歸零啦。小貓算了一下,大概是2038年吧,不過現(xiàn)在64位已經(jīng)普及了,就不用擔(dān)心了。
就到這里啦。開心。
C語言學(xué)習(xí)日記
總結(jié)
以上是生活随笔為你收集整理的语言余一个负数_C语言学习日记(8)——整数溢出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不会自动更新了_手机老是自动更新系统?不
- 下一篇: 修改表字段类型长度_PG修改字段