Conversiones.

Recordando los diferentes tipos de valores ('int', 'byte', 'long', 'double', etc.), en multitud de ocasiones en las que realices operaciones aritméticas será necesaria la conversión de los tipos de los datos, bien de sus valores o de los valores que representan variables que utilicemos en dichas operaciones. Existen dos tipos de conversiones: implícitas, cuando son realizadas automáticamente por el compilador; y explícitas, las cuales fuerzan una determinada conversión.

Conversiones implícitas.

Si un tipoo de valor se puede convertir implícitamente en otro, es posible utilizar el primer tipo, sustituyendo el segundo sin síntaxis específica:

int i = 1;
long l = i;

Como ves, no hemos añadido código fuente propio que realice ningún tipo de conversión, por lo que será el compilador el encargado de realizar la conversión delos tipos. El compilador se ajustará a unas estrictas reglas de conversión que se especifican en la siguiente tabla:

DEL TIPO AL TIPO
byte short, ushort, int, uint, long, ulong, float, double, decimal
short int, long, float, double, decimal
int long, float, double, decimal
long float, double, decimal
float double
sbyte short, int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
uint long, ulong, float, double, decimal
ulong float, double, decimal
char int, uint, long, ulong, float, double, decimal

Repito: mucho cuidado con las conversiones implícitas no contempladas estrictamente bajo las reglas de esta tabla, pues no seguir estas normas básicas producirá resultados inesperados por parte del compilador.

Conversiones explícitas.

Cuando una conversión afecta a tipos que no se pueden convertir implícitamente, será necesario que realices una conversión explícita. Esta conversión necesita una sintaxis especial. Por ejemplo:

long l = 1;
int i = (int)l;

Ahora se ha realizado la conversión dando por hecho que los tipos 'int' y 'long' pueden contener ambos el valor 1. Si el tipo de destino de la conversión no puede contener el valor origen, el valor que se usa en la conversión no reflejará la realidad:

short s = 300;
byte b = (byte)s; // b = 44;

Ahora el código fuente se ha compilado y se ha ejecutado sin errores, y podrías pasar por alto este 'bug' sin darte cuenta de él, por lo que es necesario que estés muy atento a las reglas de conversión en las conversiones explícitas.