La pregunta es:Operadores de Java cuestión interesante
¿Por qué en este caso me sale un error de compilación en Java?
byte x = 0;
x = 128;
Pero esto es legal:
x+= 999l;
utilizo eclipse, JDK 7.
Gracias
La pregunta es:Operadores de Java cuestión interesante
¿Por qué en este caso me sale un error de compilación en Java?
byte x = 0;
x = 128;
Pero esto es legal:
x+= 999l;
utilizo eclipse, JDK 7.
Gracias
En el primero de ellos:
byte x = 0;
x = 128;
Un byte es un tipo integral con signo, de 8 bits de ancho, y puede expresar el rango de -128
a +127
.
x = 128
significa "asignar a x
128
", y por defecto, 128
es de tipo int
, por lo que estamos tratando de asignar una int
a byte
lo que causaría Possible loss of precision
errores, porque int
es más ancha que byte
. Para hacer que esto funcione, tendría que emitir explícitamente el valor de 128
.
byte x = 0;
x = (byte)128; // x is now -128.
Para su segundo ejemplo, la adición de los valores a x
está muy bien, pero que acaba de desbordamiento de los valores.
byte x = 0;
x += 999L; // don't really need the long qualifier here
// x is now -25.
byte
está firmado y sólo puede contener un valor máximo de 127
y una valor mínimo de -128
, es por eso que el primer caso le da un error de compilación.
El segundo caso se compila porque y el valor que se agrega a un 'byte' se envuelve alrededor, observe que 999 % 128 = 103
, que está en el rango válido de un 'byte'
Realmente no importa qué número haya agregado, además nunca se dejará de compilar; simplemente se desbordará, en lugar de intentar asignar una constante de tiempo de compilación fuera de rango. –
@MarkoTopolnik Cierto, gracias –
Es interesante, pero ¿por qué? En el compilador puede ver que se desborda y puede prohibirlo, pero no lo hace .. –
En esta primera declaración x = 128
, ya que el rango de bytes es 0-127
en Java que requiere una conversión explícita y por lo tanto el error de compilación. En el segundo caso, se desborda y se convierte a -25 que está en el rango de bytes.
byte tiene un rango de -128 a 127. este x + = 999l; funciona porque es un operador de asignación compuesto. mira aquí possible same or alike question.
¿Qué estás tratando de preguntar exactamente, los bloques de código respectivos no tienen nada en común además de tener una variable x? – sjakubowski
Quiere decir que x es byte también en el segundo caso –