[英]type casting works differently for long to int and int to short in java
short t=(short)1 * 3;
int tadpole = (int)5 * 2L;
第一條語句工作得很好,但第二條語句拋出編譯錯誤。 按照規則,在進行算術運算時,如果有byte/short/char,默認都會轉為int。 那么第一個表達式是如何工作的呢?
另外,我檢查了
short x = (int) 30;
int y = (long) 30;
語句 3 有效,但語句 4 無效。
為什么我可以將int
分配給short
而不是long
分配給int
?
答案在第5.2 節 JLS 的賦值轉換中:
此外,如果表達式是 byte、short、char 或 int 類型的常量表達式 (§15.28):
- 如果變量的類型是 byte、short 或 char,並且常量表達式的值可以用變量的類型表示,則可以使用收縮原始轉換。
您的示例 1 和 3 屬於此子句:這些是常量表達式(值為 3 或 30),表達式的類型為int
並且值適合short
。
對於具有long
值的常量表達式,沒有類似的子句。
您的示例 2 和 4 產生long
值(在示例 2 中是因為其中一個操作數是long
,在示例 4 中是因為轉換為long
)。
請注意,您的示例 1 和 2 可能未按照您認為的那樣進行解釋。 轉換的優先級高於乘法,因此示例的計算就像它們被寫成:
short t = ((short)1) * 3;
int tadpole = ((int)5) * 2L;
為什么存在這條規則?
原因之一是Integer 字面量的定義:任何時候源代碼包含 integer 數字(沒有后綴l
或L
,這會使它成為long
),該字面量的類型是int
。
“賦值轉換”中的規則意味着你可以寫
byte[] data = { 1, 2, 3, 4 };
沒有這條規則,你將不得不寫
byte[] data = { (byte) 1, (byte) 2, (byte) 3, (byte) 4 };
long
常量不需要類似的規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.