variable tipos programacion objeto ejemplos ejemplo datos java int variable-assignment scjp ocpjp

java - tipos - ¿Por qué no puedo agregar dos bytes y obtener un int y puedo agregar dos bytes finales para obtener un byte?



tipos de variables en programacion java (2)

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 el resultado de una expresión que involucre algo de tamaño int o más pequeño es siempre un int, incluso si la suma de dos bytes cabe en un byte.

¿Por qué sucede cuando agregamos dos bytes finales que encajan en un byte? No hay error de compilación.


De la conversión de asignación JLS 5.2

Además, si la expresión es una expresión constante (§15.28) de tipo byte, short, char o int : - Se puede usar una conversión primitiva de estrechamiento si el tipo de la variable es byte, short o char, y el valor De la expresión constante es representable en el tipo de la variable.

En resumen, el valor de la expresión (que se conoce en tiempo de compilación, porque es una expresión constante) se puede representar en el tipo de la variable que es byte.

Considera tu expresión

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

Entonces, como la suma encaja en el byte, no genera un error de compilación.

Ahora si lo haces

final byte x = 100; final byte y = 100; byte z = x + y;// Compilation error it no longer fits in byte


byte z = x + y; // x and y are declared final

Aquí, dado que x e y se declaran final el valor de la expresión en RHS se conoce en el momento de la compilación, que se fija en (1 + 2 = 3) y no puede variar. Por lo tanto, no es necesario encasillarlo explícitamente

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

Mientras que, en este caso, el valor de a y b no se declaran definitivos. Por lo tanto, el valor de la expresión no se conoce en el momento de la compilación, sino que se evalúa en el tiempo de ejecución. Entonces, necesitas hacer un reparto explícito.

Sin embargo, incluso en el primer código, si el valor de a + b está fuera del rango -128 to 127 , no se compilará.

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`