Sie sind auf Seite 1von 3

Cuando los operandos de cada operacin binaria asociados a un operador son de distinto tipo, el compilador los convierte a un tipo

comn. Existen reglas que rigen estas conversiones, y aunque pueden cambiar ligeramente de un compilador a otro, en general sern ms o menos as: 1. Cualquier tipo entero pequeo como char o short es convertido a int o unsigned int. En este punto cualquier pareja de operandos ser int (con o sin signo), long, long long, double, float o long double. 2. Si un operando es de tipo long double, el otro se convertir a long double. 3. Si un operando es de tipo double, el otro se convertir a double. 4. Si un operando es de tipo float, el otro se convertir a float. 5. Si un operando es de tipo unsigned long long, el otro se convertir a unsigned long long. 6. Si un operando es de tipo long long, el otro se convertir a long long. 7. Si un operando es de tipo unsigned long, el otro se convertir a unsigned long. 8. Si un operando es de tipo long, el otro se convertir a long. 9. Si un operando es de tipo unsigned int, el otro se convertir a unsigned int. 10. Llegados a este punto ambos operandos son int. Veamos ahora el ejemplo: c = a + b; caso 10, ambas son int. s = r + a; caso 4, a se convierte a float. d = r + b; caso 4, b se convierte a float. d = n + a + r; caso 1, n se convierte a int, la operacin resultante corresponde al caso 4, el resultado (n+a) se convierte a float. t = r + a - s + c; caso 4, a se convierte a float, caso 4 (r+a) y s son float, caso 4, c se convierte a float. Tambin se aplica conversin de tipos en las asignaciones, cuando la variable receptora es de distinto tipo que el resultado de la expresin de la derecha. En el caso de las asignaciones, cuando la conversin no implica prdida de precisin, se aplican las mismas reglas que para los operandos, estas conversiones se conocen tambin como promocin de tipos. Cuando hay prdida de precisin, las conversiones se conocen como democin de tipos. El compilador normalmente emite un aviso o warning, cuando se hace una democin implcita, es decir cuando hay una democin automtica. En el caso de los ejemplos 3 y 4, es eso precisamente lo que ocurre, ya que estamos asignando expresiones de tipo float a variables de tipo int.

Conversiones a bool
En C++ podemos hablar de otro tipo de conversin de tipo implcita, que se realiza cuando se usa cualquier expresin entera en una condicin, y ms generalmente, cuando se usa cualquier expresin donde se espera una expresin booleana. El dominio del tipo bool es muy limitado, ya que slo puede tomar dos valores: true y false. Por convenio se considera que el valor cero es false, y cualquier otro valor entero es true. Por lo tanto, hay una conversin implcita entre cualquier entero y el tipo bool, y si aadimos esta regla a las explicadas antes, cualquier valor double, long double, float o cualquiera de los enteros, incluso char, se puede convertir a bool. Esto nos permite usar condiciones abreviadas en sentencias if, for, while o do...while, cuando el valor a comparar es cero. Por ejemplo, las siguientes expresiones booleanas son equivalentes:
0 == x 0 != x

equivale a !x. equivale a x.

En el primer caso, usamos el operador == para comparar el valor de x con cero, pero al aplicar el operador ! directamente a x obligamos al compilador a reinterpretar su valor como un bool, de modo que si x vale 0 el valor es false, y !false es true. De forma simtrica, si x es distinto de cero, se interpretar como true, y !true es false. El resultado es el mismo que usando la expresin 0 == x. En el segundo caso pasa algo anlogo. Ahora usamos el operador != para comparar el valor de x tambin con cero, pero ahora interpretamos directamente x como bool, de modo que si x vale 0 el valor es false, y si x es distinto de cero, se interpretar como true. El resultado es el mismo que usando la expresin 0 != x. No est claro cul de las dos opciones es ms eficaz, a la hora de compilar el programa. Probablemente, la segunda requiera menos instrucciones del procesador, ya que existen instrucciones de ensamblador especficas para comparar un entero con cero. Del otro modo estaremos comparando con un valor literal, y salvo que el compilador optimice este cdigo, generalmente se requerirn ms instrucciones de este modo. Aadir que los ejemplos anteriores funcionan aunque el tipo de x no sea un entero. Si se trata de un valor en coma flotante se realizar una conversin implcita a entero antes de evaluar la expresin.

Casting: conversiones explcitas de tipo


Para eludir estos avisos del compilador se usa el casting, o conversin explcita. Nota: de nuevo nos encontramos ante un trmino que suele aparecer en ingls en los documentos. Se podra traducir como amoldar o moldear, pero no se hace. Tambin es un trmino que se usa en cine y teatro, y se aplica al proceso de asignar papeles a los actores. La idea es anloga, en el caso de las variables, asignamos papeles a los valores, segn sus caractersticas. Por ejemplo, para convertir el valor en coma flotante 14.232 a entero se usa el valor 14, podramos decir que 14 est haciendo el papel de 14.232 en la representacin. O que se ajusta a un molde o troquel: lo que sobra se elimina. En general, el uso de casting es obligatorio cuando se hacen asignaciones, o cuando se pasan argumentos a funciones con prdida de precisin. En el caso de los argumentos pasados a funciones es tambin muy recomendable aunque no haya prdida de precisin. Eliminar los avisos del compilador demostrar que sabemos lo que hacemos con nuestras variables, aun cuando estemos haciendo conversiones de tipo extraas. En C++ hay varios tipos diferentes de casting, pero de momento veremos slo el que existe tambin en C. Un casting tiene una de las siguientes sintaxis:
(<Nombre de tipo>)<Expresin> <Nombre de tipo> (<expresin>)

Esta ltima es conocida como notacin funcional, ya que tiene la forma de una llamada a funcin. En el ejemplo anterior, las lneas 3 y 4 quedaran:
d = (int) (r + b); d = (int) (n + a + r);

O bien:
d = int(r + b); d = int(n + a + r);

Hacer un casting indica que sabemos que el resultado de estas operaciones no es un int, que la variable receptora s lo es, y que lo que hacemos lo estamos haciendo a propsito. Veremos ms adelante, cuando hablemos de punteros, ms situaciones donde tambin es obligatorio el uso de casting.

Das könnte Ihnen auch gefallen