Java數(shù)據(jù)溢出代碼詳解
java是一門相對(duì)安全的語(yǔ)言,那么數(shù)據(jù)溢出時(shí)它是如何處理的呢? 看一段代碼,
public class Overflow
{
/**
* @param args
*/
public static void main(String[] args)
{
int big = 0x7fffffff; //max int value
System.out.println("big = " + big);
int bigger = big * 4;
System.out.println("bigger = " + bigger);
}
}
運(yùn)行的結(jié)果是:
big = 2147483647 bigger = -4
int類型在java中是四字節(jié),且分正負(fù),所以最大的int型數(shù)值是0x7fffffff。變量bigger顯然是溢出了,但是你并沒(méi)有得到編譯錯(cuò)誤,或者運(yùn)行時(shí)錯(cuò)誤??雌饋?lái)不錯(cuò),但是有時(shí)候并不一定是好事情,就像這個(gè)示例,我們期望的結(jié)果應(yīng)該不是-4,而且程序也沒(méi)有錯(cuò)誤提示。
那么如何解決溢出的問(wèn)題呢? 很容易想到的一個(gè)方案是用更大的數(shù)據(jù)類型,long型占8個(gè)字節(jié),可以用,
public class Overflow
{
/**
* @param args
*/
public static void main(String[] args)
{
long reallyBig = 0x7fffffffL;
System.out.println("reallyBig = " + reallyBig);
long reallyBigger = reallyBig * 4;
System.out.println("reallyBigger = " + reallyBigger);
}
}
輸出,
reallyBig = 2147483647 reallyBigger = 8589934588
繼續(xù)思考一個(gè)問(wèn)題,第一個(gè)示例溢出的結(jié)果為什么是-4? 可以從第二個(gè)示例的結(jié)果得到一些啟示,8589934588的十六進(jìn)制是1FFFFFFFC,只留四個(gè)字節(jié)(int型只占四字節(jié))是FFFFFFFC,這是補(bǔ)碼,并且因?yàn)槭亲罡呶皇?,所以還是個(gè)負(fù)數(shù)。轉(zhuǎn)成原碼(除符號(hào)位外,取反加1)變?yōu)?0000004,也就是-4。
下面一個(gè)實(shí)例,是從另一篇文章中看到的,也給大家分享下。
long now = System.currentTimeMillis();
long m1 = now-1000*60*60*24*30*3;
long test = (long)1000*60*60*24*30*3;
long nocast = 1000L*60*60*24*30*3;
long m2 = now-1000L*60*60*24*30*3;
System.out.println("我是test:"+test);
System.out.println(nocast);
System.out.println("now:"+now);
System.out.println("m1:"+m1);
System.out.println("m2:"+m2);
輸出結(jié)果:
我是test:7776000000 7776000000 now:1359510417546 m1:1360324352138 m2:1351734417546
有點(diǎn)奇怪了吧 1000*60*60*24*30*3的計(jì)算值與1000L*60*60*24*30*3 的計(jì)算值是不一樣的 1000*60*60*24*30*3 的計(jì)算結(jié)果是-813934592
而 (long)1000*60*60*24*30*3; 1000L*60*60*24*30*3;的計(jì)算結(jié)果都是7776000000 這個(gè)結(jié)果才是需要的東西
為什么會(huì)出現(xiàn)這種情況呢 Java在做乘法時(shí),如果沒(méi)有顯示確定的數(shù)據(jù)類型,那么他會(huì)默認(rèn)按照int數(shù)據(jù)類型進(jìn)行計(jì)算就好比1000*60*60*24*30*3,這個(gè)數(shù)值在計(jì)算時(shí)導(dǎo)致int數(shù)據(jù)溢出,所以出現(xiàn)了負(fù)數(shù)的情況。
(long)1000*60*60*24*30*3; 1000L*60*60*24*30*3;這兩者,前者是將首個(gè)計(jì)算數(shù)強(qiáng)制造型為long 然后按照l(shuí)ong類型運(yùn)算得出了正確的計(jì)算結(jié)果,后者在計(jì)算時(shí)將數(shù)據(jù)類型修改為long 能直接獲得正確的計(jì)算結(jié)果,異曲同工。
這一點(diǎn)還是很隱晦的,要注意,防止以后出錯(cuò)。這錯(cuò)誤估計(jì)不好排查。
還有一點(diǎn)就是 L所在的位置,有點(diǎn)奇怪 1000L*60*60*24*30*3; 1000*60L*60*24*30*3;1000*60*60L*24*30*3;1000*60*60*24*30L*3;這幾種寫法都可以正確轉(zhuǎn)為long型,但是1000*60*60*24*30*3L;就不對(duì),而且3*60*60*24*30*1000這一種寫法的時(shí)候 L跟在任何一個(gè)數(shù)字后面都沒(méi)問(wèn)題。有點(diǎn)莫名其妙,用的時(shí)候debug測(cè)試要優(yōu)先確定這個(gè)串的計(jì)算結(jié)果。
總結(jié)
以上就是本文關(guān)于Java數(shù)據(jù)溢出代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。歡迎各位瀏覽本站的其他專題,有問(wèn)題請(qǐng)留言,小編會(huì)及時(shí)回復(fù)大家的。
- Java編程常見(jiàn)內(nèi)存溢出異常與代碼示例
- Java內(nèi)存溢出和內(nèi)存泄露
- 淺談java內(nèi)存管理與內(nèi)存溢出異常
- 完美解決java讀取大文件內(nèi)存溢出的問(wèn)題
- Java內(nèi)存區(qū)域與內(nèi)存溢出異常詳解
- Java常見(jiàn)內(nèi)存溢出異常分析與解決
- 了解Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式
- 編寫Java代碼制造一個(gè)內(nèi)存溢出的情況
- JAVA程序內(nèi)存溢出問(wèn)題原因分析
- java內(nèi)存溢出示例(堆溢出、棧溢出)
- 基于Java內(nèi)存溢出的解決方法詳解
- java虛擬機(jī)內(nèi)存溢出及泄漏實(shí)例
相關(guān)文章
IDEA項(xiàng)目使用SpringBoot+MyBatis-Plus的方法
這篇文章主要介紹了IDEA項(xiàng)目使用SpringBoot+MyBatis-Plus的方法,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
jmeter添加自定函數(shù)的實(shí)例(jmeter5.3+IntelliJ IDEA)
這篇文章主要介紹了jmeter添加自定函數(shù)的實(shí)例(jmeter5.3+IntelliJ IDEA),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Java實(shí)現(xiàn)手寫乞丐版線程池的示例代碼
在這篇文章當(dāng)中我們主要介紹實(shí)現(xiàn)一個(gè)非常簡(jiǎn)易版的線程池,深入的去理解其中的原理,麻雀雖小,五臟俱全,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-10-10
Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意實(shí)例分析
這篇文章主要介紹了Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意,結(jié)合實(shí)例形式分析了java遞歸的相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-03-03
詳解簡(jiǎn)單基于spring的redis配置(單機(jī)和集群模式)
這篇文章主要介紹了詳解簡(jiǎn)單基于spring的redis配置(單機(jī)和集群模式),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
spring無(wú)法引入注解及import org.springframework.web.bind.annota
本文主要介紹了spring無(wú)法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
IDEA遇到Internal error. Please refer to http://jb. gg/ide/crit
這篇文章主要介紹了IDEA遇到Internal error. Please refer to http://jb. gg/ide/critical-startup-errors的問(wèn)題及解決辦法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-08-08

