Pourquoi ne puis-je ajouter deux octets et d'obtenir un int et je peux ajouter deux derniers octets obtenir un octet?

public class Java{
    public static void main(String[] args){
        final byte x = 1;
        final byte y = 2;
        byte z = x + y;//ok
        System.out.println(z);

        byte a = 1;
        byte b = 2;
        byte c = a + b; //Compiler error
        System.out.println(c);
    }
}

Si le résultat d'une expression impliquant quelque chose de taille int ou plus petite est toujours un int même si la somme de deux octets correspond à un octet.

Pourquoi cela se produit-il lorsque nous ajoutons deux octets finaux qui correspondent à un octet? Il n'y a pas d'erreur de compilation.

25
demandé sur Joe 2012-10-27 16:03:30

2 réponses

À partir de la Conversion D'affectation JLS 5.2

En outre, si l'expression est une expression constante (§15.28) de type byte, short, char, int: - Une conversion primitive de rétrécissement peut être utilisée si le type de variable byte, short ou char, et la valeur de la constante expression est représentable dans le type de la variable.

Bref la valeur de l'expression (qui est connue au moment de la compilation, car c'est une constante expression) est représentable dans le type de la variable d'octets.

Considérez votre expression

 final byte x = 1;
 final byte y = 2;
 byte z = x + y;//This is constant expression and value is known at compile time

Donc, comme la sommation s'inscrit dans l'octet, elle ne déclenche pas d'erreur de compilation.

Maintenant si vous le faites

final byte x = 100;
final byte y = 100;
byte z = x + y;// Compilation error it no longer fits in byte
28
répondu Amit Deshpande 2012-10-27 12:13:55
byte z = x + y;  // x and y are declared final

Ici, puisque x et y sont déclarées final, donc la valeur de l'expression sur le RHS est connu au moment de la compilation, qui est fixé à (1 + 2 = 3) et ne peut pas varier. Donc, vous n'avez pas besoin de transtypage explicite

byte c = a + b;   // a and b are not declared final

Alors que, dans ce cas, les valeurs de a et b ne sont pas déclarées finales. Ainsi, la valeur d'expression n'est pas connue au moment de la compilation, elle est plutôt évaluée au moment de l'exécution. Donc, vous devez faire un casting explicite.


Cependant, même dans le 1er code, si la valeur de a + b sort pour être en dehors de la plage -128 to 127, il échouera à compiler.

final byte b = 121;
final byte a = 120;
byte x = a + b;  // This won't compile, as `241` is outside the range of `byte`

final byte b1 = 12;
final byte a1 = 12;
byte x1 = a1 + b1;  // Will Compile. byte can accommodate `24`
9
répondu Rohit Jain 2012-10-27 12:11:03