Java算术int与long

我在google上做了一些搜索,但我似乎无法找到我正在寻找的东西。 我试图找出有关算术在Java中的工作方式的一些详细信息。 例如,如果将两个long一起添加,这是使用在将两个int一起添加时使用的相同加法运算符吗? 此外,当你在这样的算术表达式中混合long和int时,会发生什么:

long result; long operand a = 1; int operand b = 999999999; result = a + b; 

如果有人可以对此有所了解或发布相关文章的链接,那将是非常棒的。 谢谢!

编辑:感谢您的答复到目前为止。 另外,只要在表达式中分配最宽基元类型的变量,用不同的基元执行算术是否安全?

当混合类型时,int会自动加宽为long,然后添加两个long来生成结果。 java语言规范具有包含不同主要类型的操作的良好示例。

具体来说,这些是每个主要扩展到不需要演员的类型:

  • byte to short,int,long,float或double
  • 短,int,long,float或double
  • char到int,long,float或double
  • int到long,float或double
  • 长期浮动或加倍
  • 漂浮加倍

请参阅: 转化和促销活动

根据这个,你的int被提升为long然后被评估。

例如, int + double和其他基元也是如此。 即。

 System.out( 1 + 2.0 );// prints 3.0 a double 

至于加法运算符我几乎是一样的,但我没有任何参考。

快速查看编译器的源代码可以发现它们是不同的。

iadd for int addition和ladd for long addition:

请参阅此示例代码:

 $cat Addition.java public class Addition { public static void main( String [] args ) { int a = Integer.parseInt(args[0]); long b = Long.parseLong(args[0]); // int addition int c = a + a; // long addition long d = a + b; } } $javac Addition.java $ 

编译时生成的字节码是这样的:

 $javap -c Addition Compiled from "Addition.java" public class Addition extends java.lang.Object{ public Addition(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: aload_0 1: iconst_0 2: aaload 3: invokestatic #2; //Method java/lang/Integer.parseInt:(Ljava/lang/String;)I 6: istore_1 7: aload_0 8: iconst_0 9: aaload 10: invokestatic #3; //Method java/lang/Long.parseLong:(Ljava/lang/String;)J 13: lstore_2 14: iload_1 15: iload_1 16: iadd 17: istore 4 19: iload_1 20: i2l 21: lload_2 22: ladd 23: lstore 5 25: return } 

看第16行它说: iadd (用于int添加)而22行说ladd (用于长时间添加)

另外,只要在表达式中分配最宽基元类型的变量,用不同的基元执行算术是否安全?

是的,用较小的尺寸执行算术也是“安全的” ,从某种意义上说,它们不会破坏程序,只是丢失了信息。

例如,尝试将Integer.MAX_VALUE添加到Integer.MAX_VALUE以查看发生了什么,或者int x = ( int ) ( Long.MAX_VALUE - 1 );

另外,只要在表达式中分配最宽基元类型的变量,用不同的基元执行算术是否安全?

这取决于你的安全意味着什么。 它当然不会避免你需要考虑溢出的可能性。

这称为算术推广。 详情请见http://www.cafeaulait.org/course/week2/22.html

 int a=5; long b=10; a+=b; System.out.println(a); 

主要区别在于a = a + b ,没有进行类型转换,因此编译器因为没有进行类型转换而对你生气。 但是使用a += b ,它真正做的是将类型b转换为与a兼容a类型。

这个简单的例子可以清除java中算术运算时对数据类型转换的疑虑。

  byte a = 1; short b = 1; System.out.println(a+b); //Output = 2 Object o = a+b; //Object becomes int System.out.println(o.getClass().getName()); //Output = java.lang.Integer int c = 1; System.out.println(a+b+c); //Output = 3 o = a+b+c; //Object becomes int System.out.println(o.getClass().getName()); //Output = java.lang.Integer long d = 1l; System.out.println(a+b+c+d); //Output = 4 o = a+b+c+d; //Object becomes long System.out.println(o.getClass().getName()); //Output = java.lang.Long float e = 1.0f; System.out.println(a+b+c+d+e); //Output = 5.0 o = a+b+c+d+e; //Object becomes float System.out.println(o.getClass().getName()); //Output = java.lang.Float double f = 1.0; System.out.println(a+b+c+d+e+f); //Output = 6.0 o = a+b+c+d+e+f; //Object becomes double System.out.println(o.getClass().getName()); //Output = java.lang.Double 

以下是根据java中的范围的数据类型的顺序:

  byte 

这是扩大的顺序。

注意:float的范围比long长,但是尺寸更小。