Subido por ale.prodj20

Casting

Anuncio
Conversión de tipos (casting)
a) Casting Implícito:
Quizás te hayas preguntado qué pasa cuando escribimos expresiones numéricas en las
que todos los operandos no son del mismo tipo. Por ejemplo:
char n;
int a, b, c, d;
float r, s, t;
...
a = 10;
b = 100;
r = 1000;
c = a + b;
s = r + a;
d = r + b;
d = n + a + r;
t = r + a - s + c;
...
En estos casos, cuando los operandos de cada operación binaria asociados a un operador
son de distinto tipo, se convierten a un tipo común. Existen reglas que rigen estas
conversiones, y aunque pueden cambiar ligeramente de un compilador a otro, en general
serán más o menos así:
1. Cualquier tipo entero pequeño como char o short es convertido a int o unsigned
int. En este punto cualquier pareja de operandos será int (con o sin signo),
double, float o long double.
2. Si algún operando es de tipo long double, el otro se convertirá a long double.
3. Si algún operando es de tipo double, el otro se convertirá a double.
4. Si algún operando es de tipo float, el otro se convertirá a float.
5. Si algún operando es de tipo unsigned long, el otro se convertirá a unsigned
long.
6. Si algún operando es de tipo long, el otro se convertirá a long.
7. Si algún operando es de tipo unsigned int, el otro se convertirá a unsigned int.
8. En este caso ambos operandos son int.
Veamos ahora el ejemplo:
c = a + b; caso 8, 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, 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.
También se realiza conversión de tipos en las asignaciones, cuando la variable receptora
es de distinto tipo que el resultado de la expresión de la derecha.
Cuando esta conversión no implica pérdida de precisión, se aplican las mismas reglas
que para los operandos, estas conversiones se conocen también como promoción de
tipos. Cuando hay pérdida de precisión, las conversiones se conocen como democión de
tipos. El compilador normalmente emite un aviso o "warning", cuando se hace una
conversión implícita, es decir cuando hay una conversión automática.
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.
b) Casting explícito:
Para eludir estos avisos del compilador se usa el "casting", o conversión explícita.
En general, el uso de "casting" es obligatorio cuando se hacen asignaciones, o cuando se
pasan argumentos a funciones con pérdida de precisión. En el caso de los argumentos
pasados a funciones es también muy recomendable aunque no haya pérdida de
precisión. Eliminar los avisos del compilador demostrará que sabemos lo que hacemos
con nuestras variables, aún cuando estemos haciendo conversiones de tipo extrañas.
Un "casting" tiene una de las siguientes formas:
(<nombre de tipo>)<expresión>
ó
<nombre de tipo>(<expresión>)
Esta última es conocida como notación funcional.
En el ejemplo anterior, las líneas 3 y 4 quedarían:
d = (int)(r + b);
d = (int)(n + a + r);
ó:
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 hacemos a propósito.
Editado por icamarero@gmail.com
http://programandoenc.webcindario.com
Descargar