为什么“短三十= 3 * 10”是法定转让?

2022-08-31 10:09:26

如果在算术运算中自动提升为 ,则为什么是:shortint

short thirty = 10 * 3;

变量的合法赋值 ?shortthirty

反过来,这个:

short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

以及这个:

int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

不进行编译,因为如果不按预期进行强制转换,则不允许将值赋给 。intshort

数字文字有什么特别之处吗?


答案 1

因为编译器在编译时本身会替换为 30。所以,有效地:在编译时计算。10*3short thirty = 10 * 3

尝试更改 和 to(使它们成为编译时间常量),看看会发生什么:Ptenthreefinal short

检查字节码是否同时用于验证 ( 和 )。您将能够看到几乎没有区别。javap -v10*3final short

好的,所以,这是不同情况下的字节码差异。

案例 -1 :

Java Code : main() { short s = 10*3; }

字节码 :

stack=1, locals=2, args_size=1
         0: bipush        30  // directly push 30 into "s"
         2: istore_1      
         3: return   

案例 -2 :

public static void main(String arf[])  {
   final short s1= 10;
   final short s2 = 3;
   short s = s1*s2;
}

字节码 :

  stack=1, locals=4, args_size=1
         0: bipush        10
         2: istore_1      
         3: iconst_3      
         4: istore_2      
         5: bipush        30 // AGAIN, push 30 directly into "s"
         7: istore_3      
         8: return   

案例-3 :

public static void main(String arf[]) throws Exception {
     short s1= 10;
     short s2 = 3;
     int s = s1*s2;
}

字节码 :

stack=2, locals=4, args_size=1
         0: bipush        10  // push constant 10
         2: istore_1      
         3: iconst_3        // use constant 3 
         4: istore_2      
         5: iload_1       
         6: iload_2       
         7: imul          
         8: istore_3      
         9: return 

在上面的情况下,并且取自局部变量和103s1s2


答案 2

是的,字面情况有一些特殊之处:将在编译时进行评估。因此,您不需要对乘法文本进行显式转换。10 * 3(short)

ten * three不是编译时 evaluable,因此需要显式转换。

如果 和 被标记为 ,那将是另一回事。tenthreefinal


推荐