procyon pasar normalizer fernflower ejemplo decompilador cfr java types

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 .