標籤:
<span style="font-size:14px;">public class TestCast {public static void main(String[] args) {int money=1000000000;//10億int year=20;int total=money*year;System.out.println(total);}}</span>
輸出結果:-1474836480
這個時候我們就可以想到int的範圍是-21億~21億,而money*year的結果明顯超出這個範圍,所以會溢出,然而將total的資料類型改成long會怎麼樣呢?
public class TestCast {public static void main(String[] args) {int money=1000000000;//10億int year=20;long total=money*year;System.out.println(total);}}輸出結果:-1474836480
理論上講應該就會輸出正確結果,可實際情況還是溢出。這是為什麼呢?因為money和year都是int型,所以他倆的乘積也是int型,超出int型就會出現溢出,可以怎麼解決呢?把money或者year強制轉換成long型即可,如下:
<span style="font-size:14px;">int money=1000000000;//10億int year=20;long total=(long)money*year;System.out.println(total);</span>
輸出結果:20000000000
這樣就輸出了正確結果。但如果寫成long total=(long)(money*year);的話,結果依然不正確,因為money與year的乘積已經溢出再強制轉換成long類型,結果依然不正確。
再看下面一個小例子:
public class TestCast {public static void main(String[] args) {/*int money=1000000000;//10億int year=20;long total=money*year;System.out.println(total);*//*int money=1000000000;//10億int year=20;long total=(long)money*year;System.out.println(total);*///一個人70年心跳多少次long times=70*60*24*365*60;System.out.println(times);}}輸出結果:-2087447296
很明顯溢出,應該如何處理呢?在這條語句long times=70*60*24*365*60;的任一數字後面加上L,強制轉換成long類型即可。如long times=70*60*24*365*60L;小技巧,在第一個數字後面加L,這樣的話防止前面的相乘結果已溢出如:long times=70L*60*24*365*60;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
總結
之前A題的時候經常遇到這種大數問題,有時候能搞正確有時候就需要調試幾次才能正確,現在已經徹底搞明白大數的強制轉換溢出的問題,希望能幫到不明白的朋友。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java基礎資料型別 (Elementary Data Type)自動轉型溢出問題