2011-02-11 25 views
15

si tengo una variable de bytes: byte b = 0;¿por qué byte + = 1 compilar pero byte = byte + 1 no?

¿por qué los siguientes trabajos:

b++; 
    b += 1; // compiles 

... pero esto no lo hace?

b = b + 1; // compile error 

¿El compilador de entender primero como byte y la segunda como int?

[EDIT]

Sé que la fundición, pero quiero llamar su atención sobre el b++, b += 1 and b = b + 1

creo que son iguales ¿por qué compilador de ellas se diferencia? ¿cuál es la diferencia entre

b += 1 and b = b + 1 ? 
+0

http://stackoverflow.com/questions/81392/java-why-do-i-receive-the-error-message-type-mismatch-cannot-convert-int-to-by tiene su respuesta – pyvi

+1

nada a se ríen de :) el operador + prácticamente asegura la parte int – bestsss

+1

para la parte de edición: 'byte b = 0; b + = 333; 'esto está bien. b + = 1 se compila como b = (byte) (b + 1) – bestsss

Respuesta

20

Debido b += 1 es un equivalente a b = (byte)(b + 1), mientras que el tipo de b + 1 es ascendido a int (JLS §5.6.2 Binary Numeric Promotion) y por lo tanto, su resultado no se puede asignar a byte sin conversión explícita

De JLS, §15.26.2 Compound Assignment Operators:

Una expresión de asignación compuesto de la op forma E1 = 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.

+0

¿Hay alguna manera de escribir una constante numérica para que se vea como un byte? Si escribo 7F, se ve como un flotador, 7L es largo, y así sucesivamente. ¿Sería algo como 7B visto como un byte? – BigMac66

+0

@ BigMac66, 'byte final estático C1 = 11; // este es un byte' pero aún agrega C1 + C1 no es un byte, pero' byte final estático C2 = C1 + C1; 'es correcto (b/c se calcula por el compilador no el tiempo de ejecución), elimine 'final' de C1 y es un error. – bestsss

+0

Lo entiendo, lo que estoy preguntando es cuando escribes un valor constante primitivo puedes agregar una letra para designar el tipo que quieres que sea esa constante, ¿hay alguna letra para la primitiva de bytes? Hasta ahora solo puedo encontrar L (largo), D (doble) y F (flotar) - ¿hay otros? – BigMac66

2

Sí, el resultado de la + -operación es int, así que se necesita un molde con el fin de asignar a una variable byte.

3

El problema es la posible pérdida de precisión. Equípelo y está bien.

b = (byte) (b + 1); 
+0

La respuesta es correcta, pero todavía no me gusta la explicación. Si la posible pérdida de precisión fuera una razón válida aquí, entonces lo mismo debería prohibirse para los enteros. Después de todo, 'Integer.MAX_VALUE + 1' tiene el mismo problema (o uno similar). –

+0

Tienes razón. El compilador lo protege mejor con bytes que enteros: b = 127; está bien para el compilador, mientras que b = 128; no es y debe ser lanzado antes de que le dé un valor de -128 que es correcto. No es así con enteros. Por otro lado, puede decir int i = 2147483647; que es Integer.MAX_VALUE y si sube por una int i = 2147483648; se obtiene un error de compilación "número entero demasiado grande". Creo que axtavt explica bien la situación. Con el byte tenemos una promoción con el int no. –

0

, es necesario especificar a byte:

b = (byte) (b + 1); 
+0

editado. Sé que el casting resuelve este problema, pero quiero aprender otra cosa escrita en la parte –

0

Hacer b + 1 amplía el resultado a entero, y la asignación de vuelta al byte b causaría pérdida de precisión. Explicado: Conversions and Promotions. Pero me gusta más la respuesta de Axtavt.

2

En java, el valor predeterminado para enteros es int, y para números de coma flotante es doble. Por lo tanto, b se convierte por defecto a entero para realizar la operación. Por lo tanto, la respuesta resultante debe escribirse antes de almacenarse para evitar cualquier posible pérdida de precisión. Pero b+=1 lo hace automáticamente.

0

No me gusta el argumento sobre la pérdida de precisión, ya que el compilador no lo protegerá de manera similar cuando se trata de ints y longs. Creo que la respuesta real se encuentra con el JLS simple hecho de tener un mejor soporte para enteros que bytes, como se indica en esta respuesta: https://stackoverflow.com/a/13211737/567000

1

operandos de tipo byte y short automáticamente se transfieren a int antes de ser entregado a los operadores

así que cuando lo haga byte b = b + 1; lo considera "int" ya que se realiza una operación en el valor del byte. para evitar esto usamos b + = 1; aquí se escribe automáticamente en byte.

Cuestiones relacionadas