См .: Конверсии и продвижения
В соответствии с этим ваше int
повышается до long
, а затем оценивается.
То же самое происходит с, дляэкземпляр, int
+ double
и остальные примитивы.
System.out( 1 + 2.0 );// prints 3.0 a double
Что касается оператора сложения Я почти такой же, но у меня нет никаких ссылок на него.
AБыстрый просмотр исходного кода компилятора показывает, что они разные.
А именно iadd
для сложения int и ladd
для длинного добавления:
См. Этот пример кода:
$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."<init>":()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 );