[英]Java literal value assignment behaviour
在Kathy Sierra的SCJP指南中,在作業章節中,我們知道我們可以聲明類似這個byte b = 7;
。 在場景后面,代碼是byte b = (byte) 7;
。 這是因為在java中,數字7被認為是文字int值,因此必須轉換為int。
現在其他情況。 Double可以包含float值中包含的每個字節,因為它是一個更大的數據類型。 那么我們可以說float f = 10.543;
因為10.543是一個很小的值,應該適合浮動。 此類數字的字面值也被視為Double,因此編譯器應隱式將其強制轉換為float。 但事實並非如此,編譯器阻止了我們。 我們必須在該值之后附加F
或f
。
為什么這兩個沖突的行為存在於字面值賦值? 簡而言之,如果byte b = 7
是可能的。 為什么不能float f = 10.543
?
您可以閱讀JLS 5.2分配轉換
常量的編譯時縮小意味着代碼如下:
byte theAnswer = 42;
被允許。 如果沒有縮小,整數文字42的類型為int的事實意味着需要轉換為字節:
byte theAnswer = (byte)42; // cast is permitted but not required
如果表達式的類型無法通過賦值上下文中允許的轉換轉換為變量的類型,則會發生編譯時錯誤。
如果變量的類型是float或double,則將值集轉換(第5.1.13節)應用於值v
JLS#3.10.2.Floating-Point Literals
如果浮點文字后綴為ASCII字母F或f,則浮點文字的類型為float; 否則其類型為double,並且可以選擇以ASCII字母D或d為后綴
從double到float的縮小基元轉換由IEEE 754舍入規則(第4.2.4節)控制。 這種轉換可能會失去精度,但也會失去范圍,導致從非零雙精度浮點零和從有限雙精度浮點無窮大。 雙NaN轉換為浮點NaN,雙無窮大轉換為相同的浮點無窮大。
我希望上面澄清你的疑問。
要添加到先前的答案,10.543的實際表示是:
由於您實際上指定了兩個不同的數字,因此需要顯式聲明是有意義的。
區別:
為float指定double會導致精度損失,因此java告訴您需要明確說明如何執行賦值。 簡單截斷可能會導致嚴重的舍入錯誤。
考慮基數10中的有限小數實際上可以是二進制(例如浮點)基數中的無限小數值。 因此,在浮點類型之間進行顯式轉換是一個很好的經驗法則,在絕大多數情況下都很有用。
對於像字節這樣的整數類型,情況略有不同:整數類型只能在大小上有所不同,但它們都具有相同的小數精度,即零。 因此,將較大積分類型的擬合值分配給較小的積分變量沒有任何歧義。
“在場景后面,代碼是字節b =(字節)7”。
那不對。 請參閱其他幾個答案中提到的JLS#5.2 。 它說:“如果變量的類型是byte,short或char,則可以使用縮小的原始轉換,並且常量表達式的值可以在變量的類型中表示。”
什么都沒有關於類型轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.