欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年09月30日 12:04:56   作者:Pony小馬  
這篇文章主要介紹了Java數(shù)據(jù)溢出的相關(guān)內(nèi)容,包括具體代碼示例,分析比較詳細,希望對大家有所幫助,感興趣的朋友可以參考下。

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

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); 
  } 
} 

運行的結(jié)果是:

big = 2147483647 
bigger = -4 

int類型在java中是四字節(jié),且分正負,所以最大的int型數(shù)值是0x7fffffff。變量bigger顯然是溢出了,但是你并沒有得到編譯錯誤,或者運行時錯誤??雌饋聿诲e,但是有時候并不一定是好事情,就像這個示例,我們期望的結(jié)果應(yīng)該不是-4,而且程序也沒有錯誤提示。
那么如何解決溢出的問題呢? 很容易想到的一個方案是用更大的數(shù)據(jù)類型,long型占8個字節(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ù)思考一個問題,第一個示例溢出的結(jié)果為什么是-4? 可以從第二個示例的結(jié)果得到一些啟示,8589934588的十六進制是1FFFFFFFC,只留四個字節(jié)(int型只占四字節(jié))是FFFFFFFC,這是補碼,并且因為是最高位是1,所以還是個負數(shù)。轉(zhuǎn)成原碼(除符號位外,取反加1)變?yōu)?0000004,也就是-4。

下面一個實例,是從另一篇文章中看到的,也給大家分享下。

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 

有點奇怪了吧 1000*60*60*24*30*3的計算值與1000L*60*60*24*30*3 的計算值是不一樣的 1000*60*60*24*30*3 的計算結(jié)果是-813934592

而 (long)1000*60*60*24*30*3;  1000L*60*60*24*30*3;的計算結(jié)果都是7776000000 這個結(jié)果才是需要的東西

為什么會出現(xiàn)這種情況呢 Java在做乘法時,如果沒有顯示確定的數(shù)據(jù)類型,那么他會默認按照int數(shù)據(jù)類型進行計算就好比1000*60*60*24*30*3,這個數(shù)值在計算時導(dǎo)致int數(shù)據(jù)溢出,所以出現(xiàn)了負數(shù)的情況。

(long)1000*60*60*24*30*3;  1000L*60*60*24*30*3;這兩者,前者是將首個計算數(shù)強制造型為long 然后按照long類型運算得出了正確的計算結(jié)果,后者在計算時將數(shù)據(jù)類型修改為long 能直接獲得正確的計算結(jié)果,異曲同工。

這一點還是很隱晦的,要注意,防止以后出錯。這錯誤估計不好排查。

還有一點就是 L所在的位置,有點奇怪 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;就不對,而且3*60*60*24*30*1000這一種寫法的時候 L跟在任何一個數(shù)字后面都沒問題。有點莫名其妙,用的時候debug測試要優(yōu)先確定這個串的計算結(jié)果。

總結(jié)

以上就是本文關(guān)于Java數(shù)據(jù)溢出代碼詳解的全部內(nèi)容,希望對大家有所幫助。歡迎各位瀏覽本站的其他專題,有問題請留言,小編會及時回復(fù)大家的。

相關(guān)文章

  • Spring IOC相關(guān)注解運用(上篇)

    Spring IOC相關(guān)注解運用(上篇)

    這篇文章主要介紹了Spring?IOC相關(guān)注解的運用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Spring @Value的注解使用和原理解析

    Spring @Value的注解使用和原理解析

    @Value注解在Spring開發(fā)中是一個使用很頻繁的注解,在項目開發(fā)中,我們通常需要讀取配置文件中的一些信息,當然,@Value不單單能讀取配置文件,還能讀取系統(tǒng)屬性,還可以讀取其他bean的屬性,本章就來詳細介紹@Value注解的使用和對源碼進行分析
    2023-06-06
  • Java實現(xiàn)駝峰與下劃線互轉(zhuǎn)的方法

    Java實現(xiàn)駝峰與下劃線互轉(zhuǎn)的方法

    這篇文章主要為大家詳細介紹了Java實現(xiàn)駝峰與下劃線互轉(zhuǎn)的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • Java字符串比較方法equals的空指針異常的解決

    Java字符串比較方法equals的空指針異常的解決

    這篇文章主要介紹了Java字符串比較方法equals的空指針異常的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤解決方法

    mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤解決方法

    使用MyBatis能夠幫助我們將SQL語句和Java代碼分離,這篇文章主要給大家介紹了關(guān)于mybatis創(chuàng)建項目報Invalid?bound?statement?(not?found)錯誤的解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 解決Java Calendar類set()方法的陷阱

    解決Java Calendar類set()方法的陷阱

    這篇文章主要介紹了解決Java Calendar類set()方法的陷阱,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Spring Boot 快速入門指南

    Spring Boot 快速入門指南

    Spring 框架是非常著名的 Java 開源框架,歷經(jīng)十多年的發(fā)展,整個生態(tài)系統(tǒng)已經(jīng)非常完善甚至是繁雜,Spring Boot 正是為了解決這個問題而開發(fā)的,為 Spring 平臺和第三方庫提供了開箱即用的設(shè)置,只需要很少的配置就可以開始一個 Spring 項目
    2017-03-03
  • Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn)

    Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn)

    本文主要介紹了Java獲取Prometheus監(jiān)控數(shù)據(jù)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • RocketMQ的消費者類型與最佳實踐詳解

    RocketMQ的消費者類型與最佳實踐詳解

    這篇文章主要介紹了RocketMQ的消費者類型與最佳實踐詳解,在?RocketMQ?5.0?中,更加強調(diào)了客戶端類型的概念,尤其是消費者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下
    2023-10-10
  • Spring?Cloud?Alibaba?Nacos服務(wù)治理平臺服務(wù)注冊、RestTemplate實現(xiàn)微服務(wù)之間訪問負載均衡訪問的問題

    Spring?Cloud?Alibaba?Nacos服務(wù)治理平臺服務(wù)注冊、RestTemplate實現(xiàn)微服務(wù)之間訪

    這篇文章主要介紹了Spring?Cloud?Alibaba:Nacos服務(wù)治理平臺,服務(wù)注冊、RestTemplate實現(xiàn)微服務(wù)之間訪問,負載均衡訪問,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論