真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java數(shù)據(jù)溢出代碼詳解

java是一門(mén)相對(duì)安全的語(yǔ)言,那么數(shù)據(jù)溢出時(shí)它是如何處理的呢? 看一段代碼,

創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元海勃灣做網(wǎng)站,已為上家服務(wù),為海勃灣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

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類(lèi)型在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ù)類(lèi)型,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ù)類(lèi)型,那么他會(huì)默認(rèn)按照int數(shù)據(jù)類(lèi)型進(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類(lèi)型運(yùn)算得出了正確的計(jì)算結(jié)果,后者在計(jì)算時(shí)將數(shù)據(jù)類(lèi)型修改為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;這幾種寫(xiě)法都可以正確轉(zhuǎn)為long型,但是1000*60*60*24*30*3L;就不對(duì),而且3*60*60*24*30*1000這一種寫(xiě)法的時(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ì)大家有所幫助。歡迎各位瀏覽本站的其他專(zhuān)題,有問(wèn)題請(qǐng)留言,小編會(huì)及時(shí)回復(fù)大家的。


當(dāng)前文章:Java數(shù)據(jù)溢出代碼詳解
本文地址:http://weahome.cn/article/jddpgs.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部