1. 程式人生 > >JAVA-初步認識-第二章-類型運算細節

JAVA-初步認識-第二章-類型運算細節

系統 .com 技術 出錯 計算 兩種 比較 過程 正常

一. 深入探究變量在不同過程中背後隱藏的原理

變量在程序中參與了兩種過程,定義和計算。我們舉一些例子,來說明背後的原理。(除了數值型的變量外,其它類型的也可以是變量,只要一直在變動的就是變量。)

在變量的定義過程中,byte b=4; 書寫出來的4默認的是int類型,將其賦值給byte類型,在DOS中,應該報錯為精度缺失。但是DOS並沒有報錯,反而運行的很正常。原理就是:在賦值的過程中,計算機會進行判斷,賦的值是否在所規定的類型範圍之內。在這裏4是在-128~127的範圍裏的,只要在這裏範圍裏,計算機會自動地進行強制類型轉換,原因就在於不會造成精度損失。同樣的,byte b=4; b=3+7; 結果也不會報錯,原理也是一樣的。

註意:相同的數值,換種說法,DOS就會報錯。byte b=4, b1=3, b2=7; b=b1+b2; 這裏運行出錯的原因在於,b1和b2是變量,以目前的3和7來看,結果是不會損失精度。但變量的特點就在於數據會變,為了防止以後超出範圍,在這裏直接報錯。→貌似這種說法有些牽強。說的更明白一些,就是右側的b1和b2是不確定的,兩者的相加的結果可能會超出byte的範圍。如果在這裏將b的類型定義為int,int可以容納兩個byte類型變量的所有的範圍,就不會報錯。(其實計算機是一步一步進行運算的,b=b1+b2,我的理解是這樣的,右側先計算,計算的結果賦值給b,右側計算的結果在沒有賦值前是一個未知類型的數值,依據JAVA的原理,默認為int,這個int類型的數值可能小於byte範圍,也可能大於byte,這樣在強制轉換的時候,可能損失精度。相同的原理,對於下面的例子而言,三個int類型,X X1 X2,右側的未定義時,默認為int,如果超過int範圍,先進行了舍棄,這樣再賦值給左側int X時就不會有任何問題。)

換個一種類型,三個變量之間的運算,按照byte的說法來看,這裏應該會報錯,但是並沒有。原因就在於,計算機中,任何整數運算的結果都還是整數,即使超過精度,系統也會自動截取,所以默認的類型不會報錯,但是輸出的結果也不一定是正確的,除非兩個參與計算的int類型數值都比較小,不超精度。

技術分享技術分享

JAVA-初步認識-第二章-類型運算細節