簡體   English   中英

在 java 中,long 到 int 和 int 到 short 的類型轉換工作方式不同

[英]type casting works differently for long to int and int to short in java

  1. short t=(short)1 * 3;
  2.  int tadpole = (int)5 * 2L;

第一條語句工作得很好,但第二條語句拋出編譯錯誤。 按照規則,在進行算術運算時,如果有byte/short/char,默認都會轉為int。 那么第一個表達式是如何工作的呢?

另外,我檢查了

  1. short x = (int) 30;
  2.  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 可能未按照您認為的那樣進行解釋。 轉換的優先級高於乘法,因此示例的計算就像它們被寫成:

  1.  short t = ((short)1) * 3;
  2.  int tadpole = ((int)5) * 2L;

為什么存在這條規則?

原因之一是Integer 字面量的定義:任何時候源代碼包含 integer 數字(沒有后綴lL ,這會使它成為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM