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长,但是尺寸更小。