java - pasar - ¿por qué byte+= 1 compilar pero byte=byte+1 no?
pasar de.class a java (8)
Si tengo una variable de byte b = 0;
: byte b = 0;
¿Por qué funciona el siguiente trabajo:
b++;
b += 1; // compiles
... pero esto no?
b = b + 1; // compile error
¿El compilador entiende primero como byte
y segundo como int
?
[EDITAR]
Lo sé, pero quiero llamar tu atención sobre b++, b += 1 and b = b + 1
Creo que son iguales, entonces ¿por qué el compilador los diferencia? Cuál es la diferencia entre
b += 1 and b = b + 1 ?
Al hacer b + 1
ensancha el resultado a entero, y la asignación de nuevo al byte b causaría pérdida de precisión. Explicado: Conversiones y Promociones . Pero me gusta más la respuesta de axtavt.
Debido a que b += 1
es equivalente a b = (byte)(b + 1)
, mientras que el tipo de b + 1
se promueve a int
( JLS §5.6.2 Promoción numérica binaria ) y, por lo tanto, su resultado no se puede asignar a byte
sin conversión explícita.
De JLS, §15.26.2 Operadores de asignación de compuesto :
Una expresión de asignación compuesta de la forma E1 op = E2 es equivalente a E1 = (T) ((E1) op (E2)), donde T es el tipo de E1, excepto que E1 se evalúa solo una vez.
En java, el valor predeterminado para los enteros es int, y para los números de punto flotante es doble. Entonces, b
se convierte por defecto a entero para realizar la operación. Por lo tanto, la respuesta resultante debe tipificarse antes de ser almacenada para evitar cualquier posible pérdida de precisión. Pero b+=1
hace automáticamente.
Los operandos de tipo byte y short se promueven automáticamente a int antes de ser entregados a los operadores.
así que cuando haces byte b = b + 1; considera que es "int", ya que una operación se realiza en un valor de byte. así que para evitar esto usamos b + = 1; Aquí se escribe automáticamente a byte.
Necesitas lanzar a byte:
b = (byte) (b + 1);
No compro el argumento acerca de la pérdida de precisión, ya que el compilador no lo protegerá de manera similar cuando trate con intenciones y largos. Creo que la respuesta real radica en que JLS simplemente tiene mejor soporte para ints que bytes, como se indica en esta respuesta: https://.com/a/13211737/567000
Posible pérdida de precisión es el problema. Lánzalo y está bien.
b = (byte) (b + 1);
Sí, el resultado de la operación +
es int
, por lo que se necesita una conversión para asignarla a una variable de byte
.