AOWS

Just another adrian’s weblog

Java: cast implícito en el operador +=

leave a comment »

Por estas latitudes hace un frío que pela, así que que mejor que dejar constancia de una pequeña curiosidad que comenté hace unos días sobre los operadores = y += en esta mañana de domingo.

Java realiza un cast implícito en la asignación de literales. Por eso estas expresiones son correctas:

byte b = 73;
short s = 28730;

a pesar de que los literales numéricos como éstos se evalúan a int. Es decir, lo anterior es equivalente a:

byte b = (byte) 73;
short s = (short) 28730;

Sin embargo, esto:

byte b =  128;

no compila, ya que 128 está fuera del rango de una variable de tipo byte y el compilador no realiza el casteo y nos avisa de ello. Tenemos que decirle que está bien y siga adelante con un cast explícito:

byte b = (byte) 128;

Aunque obviamente b no tiene ahora el valor 128, ya que se trunca a los primeros 8 bits.

Hasta aquí más o menos fácil, pero ahora viene lo interesante. ¿Debería lo siguiente compilar?

byte a = 10;
byte b = 10;
byte c = a + b;

La expresión a la derecha del operador = se evalúa a int, con valor 20. Una cantidad que puede perfectamente guardarse en una variable de tipo byte… pero esto no es correcto. El compilador no tiene en cuenta el valor que pueda resultar, y avisa de que se está intentando asignar un int a un byte. Lo resolvemos con un cast explícito como antes:

byte c = (byte) a + b;

Sin embargo, y aquí es dónde me he sorprendido, lo siguiente sí compila:

b += a;

Esta expresión supuestamente sería equivalente a:

b = b + a;

lo cual no debería compilar pues la expresión de la derecha se evalúa a int como acabamos de ver. Pero esto no funciona así, el operador += realiza un cast implícito al tipo de la variable sobre la que opera, por lo que la sentencia equivalente sería la siguiente:

b= (byte) b + a;

Una (tonto)curiosidad.

Written by adrian

12 abril, 2009 a 12:34

Publicado en Uncategorized

Tagged with

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: