2012-05-14 15 views
6

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

+0

¿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

+1

Quiere decir que x es byte también en el segundo caso –

Respuesta

2

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 x128", 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. 
4

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'

+0

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. –

+0

@MarkoTopolnik Cierto, gracias –

+0

Es interesante, pero ¿por qué? En el compilador puede ver que se desborda y puede prohibirlo, pero no lo hace .. –

0

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.