Voir: Conversions and promotions
D'après cela, votre int
est promu long
puis est évaluée. Il en est de même avec int
+ double
et le reste des primitives. c'est à dire.
System.out(1 + 2.0);// prints 3.0 a double
En ce qui concerne l'opérateur d'addition
je suis à peu près c'est le même, mais je n'ai pas de référence de celui-ci.
Une vue rapide de la source du compilateur révèle qu'ils sont différents.
A savoir iadd
pour l'addition int et ladd
longtemps plus:
Voir cet exemple de code:
$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
$
Lorsque compilé le code octet généré est ceci:
$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
}
Regardez ligne 16
il est dit: iadd
(pour int plus) alors que la ligne 22
indique ladd
(pour plus longtemps)
Aussi, est-il sûr d'effectuer des opérations arithmétiques avec différentes primitives tant que vous assignez dans une variable de type primitif le plus dans votre expression?
Oui, et il est aussi « sûr » pour effectuer des opérations arithmétiques avec des tailles plus petites, en ce sens, ils ne cassent pas le programme, vous venez de perdre des informations.
Par exemple, essayez d'ajouter Integer.MAX_VALUE à Integer.MAX_VALUE
pour voir ce qui se passe, ou int x = (int) (Long.MAX_VALUE - 1);
Ce n'est pas un forum, il n'est pas vraiment transparent pour les personnes qui ont répondu à votre question que vous avez un suivi. Comme pour votre edit si: Java ne vous permettra pas d'affecter le résultat d'une opération à une variable si la variable n'est pas d'un type primitif "large" assez pour le contenir.Autrement dit, vous ne pouvez pas assigner le résultat de "0L + 1" à un int sans lancer spécifiquement un int. –
Ah ok, c'est logique. Merci pour le suivi. – BordrGuy108
Ce n'est pas tout à fait sûr car de nombreuses opérations peuvent entraîner un débordement ou un débordement. essayez Long.MAX_VALUE + 1 Cependant, il compilera toujours si vous affectez au type le plus large. –