c語言溢出會(huì)得到什么結(jié)果?如何有效避免

很多朋友對(duì)于c語言溢出會(huì)得到什么結(jié)果?如何有效避免和c語言溢出怎么處理不太懂,今天就由小編來為大家分享,希望可以幫助到大家,下面一起來看看吧! 文章目錄: 1、c語言中...
很多朋友對(duì)于c語言溢出會(huì)得到什么結(jié)果?如何有效避免和c語言溢出怎么處理不太懂,今天就由小編來為大家分享,希望可以幫助到大家,下面一起來看看吧!
文章目錄:
c語言中溢出如何處理
1、C語言對(duì)于int類型數(shù)據(jù)超出范圍的處理,只有一個(gè)最簡單的原則:截?cái)嗵幚恚闯鰅nt位長度范圍的高字節(jié)被自動(dòng)截掉。
2、首先,打開C語言編譯器,新建一個(gè)初始.cpp文件,例如:test.cpp,輸入問題基礎(chǔ)代碼。在test.cpp文件中,將int全部調(diào)整為long long,printf函數(shù)調(diào)整為:printf(%lld!=%lld\n,n,count);。編譯器運(yùn)行test.cpp文件,此時(shí)成功打印出了大數(shù)。
3、計(jì)算機(jī)在進(jìn)行計(jì)算時(shí)是用補(bǔ)數(shù)計(jì)算的,且如果溢出會(huì)進(jìn)行丟位處理。如short型32767補(bǔ)碼是0111111111111111 加1后為1000000000000000(注意最高位是符號(hào)位),1000000000000000正是-32768的補(bǔ)數(shù)。
C語言整型溢出會(huì)怎樣
C語言的整型溢出,分為無符號(hào)整型溢出和有符號(hào)整型溢出。對(duì)于unsigned整型溢出,C的規(guī)范是有定義的——“溢出后的數(shù)會(huì)以2^(8*sizeof(type)作模運(yùn)算”,也就是說,如果一個(gè)unsigned char(1字符,8bits)溢出了,會(huì)把溢出的值與256求模。
乘法結(jié)果的類型也是int,不會(huì)發(fā)生其他轉(zhuǎn)換。然而,有符號(hào)整數(shù)運(yùn)算發(fā)生溢出會(huì)產(chǎn)生未定義行為,非無符號(hào)整數(shù)存在此問題。11111 * 11111 = 123454321,值為int類型,而111111 * 111111 = 12345654321,超出了int表示范圍,產(chǎn)生未定義行為。同樣,111111111 * 111111111也會(huì)出現(xiàn)未定義行為。
整形就是int型,上溢就是從最大正數(shù)變成最大負(fù)數(shù) 但是如果是unsigned的時(shí)候,最大值上溢就變成0了。
從C語言的內(nèi)部處理機(jī)制來說,int型數(shù)超出范圍(溢出)被認(rèn)為是一個(gè)正?,F(xiàn)象,只會(huì)產(chǎn)生錯(cuò)誤的計(jì)算結(jié)果或邏輯錯(cuò)誤,而不會(huì)觸發(fā)數(shù)據(jù)溢出的異常。因此,為了避免因?yàn)檎麛?shù)溢出而產(chǎn)生程序邏輯或計(jì)算錯(cuò)誤,程序員必須自行檢測(cè)可能出現(xiàn)的溢出或者確保不會(huì)出現(xiàn)數(shù)據(jù)溢出的情況。
另外數(shù)據(jù)存儲(chǔ)在變量里時(shí)與變量的數(shù)據(jù)類型密切相關(guān)。所以溢出現(xiàn)象要分類討論。例如,unsigned int型或unsigned short型或unsigned char型變量在上溢出時(shí),將舍去超范圍數(shù)據(jù),其值仍然為正。
C語言中int的取值范圍為:-2147483648 ~ 2147483647。超過了這個(gè)范圍進(jìn)行賦值,C源代碼是無法通過編譯的。
c語言中數(shù)據(jù)溢出的問題怎么解決?
1、首先,打開C語言編譯器,新建一個(gè)初始.cpp文件,例如:test.cpp,輸入問題基礎(chǔ)代碼。在test.cpp文件中,將int全部調(diào)整為long long,printf函數(shù)調(diào)整為:printf(%lld!=%lld\n,n,count);。編譯器運(yùn)行test.cpp文件,此時(shí)成功打印出了大數(shù)。
2、乘法結(jié)果的類型也是int,不會(huì)發(fā)生其他轉(zhuǎn)換。然而,有符號(hào)整數(shù)運(yùn)算發(fā)生溢出會(huì)產(chǎn)生未定義行為,非無符號(hào)整數(shù)存在此問題。11111 * 11111 = 123454321,值為int類型,而111111 * 111111 = 12345654321,超出了int表示范圍,產(chǎn)生未定義行為。同樣,111111111 * 111111111也會(huì)出現(xiàn)未定義行為。
3、如果還怕出現(xiàn)溢出,先將a也取余數(shù)就可以了。
4、long 型數(shù)據(jù)要加附加格式說明符 l 。輸出的格式:printf(%ld,%ld,a,b);注意,2個(gè)數(shù)都是用%ld格式輸出,否則可能會(huì)得到意外的結(jié)果。
c語言溢出會(huì)得到什么結(jié)果?如何有效避免和c語言溢出怎么處理的問題分享結(jié)束啦,以上的文章解決了您的問題嗎?歡迎您下次再來哦!
本文鏈接:http://xinin56.com/bian/228430.html