在java中,类型转换对long-to-int和int对short的作用不同


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

第一条语句运行良好,但第二条语句引发编译错误。根据规则,在执行算术运算时,默认情况下,if any 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 Literals的定义:任何时候源代码包含一个整数(没有后缀lL,这将使其成为long(,该文本的类型都是int

来自";"分配转换";意味着您可以编写

byte[] data = { 1, 2, 3, 4 };

如果没有这个规则,你就必须编写

byte[] data = { (byte) 1, (byte) 2, (byte) 3, (byte) 4 };

CCD_ 15常数不需要类似的规则。

最新更新