Conversiones numéricas integradas (referencia de C#)

C# proporciona un conjunto de tipos numéricos enteros y de punto flotante. Existe una conversión entre dos tipos numéricos, ya sea implícita o explícita. Debe usar una expresión Cast para realizar una conversión explícita.

Conversiones numéricas implícitas

En la tabla siguiente se muestran las conversiones implícitas predefinidas entre los tipos numéricos integrados:

De En
sbyte short, int, long, float, double, decimal o nint
byte short, ushort, int, uint, long, ulong, float, double, decimal, nint o nuint
short int, long, float, double, o decimal, o nint
ushort int, uint, long, ulong, float, double, o decimal, nint, o nuint
int long, float, double, o decimal, nint
uint long, ulong, float, double, o decimal, o nuint
long float, doubleo decimal
ulong float, doubleo decimal
float double
nint long, float, double o decimal
nuint ulong, float, double o decimal

Nota:

Las conversiones implícitas de int, uint, long, ulong, nint o nuint a float y de long, ulong, nint o nuint a doublepueden provocar una pérdida de precisión, pero nunca una pérdida de un orden de magnitud. El resto de conversiones numéricas implícitas nunca pierden información.

Tenga en cuenta también lo siguiente:

  • Cualquier tipo numérico entero es implícitamente convertible en cualquier tipo numérico de punto flotante.

  • No hay ninguna conversión implícita a los tipos byte y sbyte. No hay ninguna conversión implícita de los tipos double y decimal.

  • No hay ninguna conversión implícita entre el tipo decimal y el tipo float o double.

  • Un valor de una expresión constante de tipo int (por ejemplo, un valor representado por un literal entero) se puede convertir implícitamente en sbyte, byte, short, ushort, uint, ulong, nint o nuint, siempre que esté dentro del rango del tipo de destino:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    Como se muestra en el ejemplo anterior, si el valor constante no está dentro del rango del tipo de destino, se produce el error del compilador CS0031.

Conversiones numéricas explícitas

La siguiente tabla muestra las conversiones explícitas predefinidas entre tipos numéricos integrados para los que no hay ninguna conversión implícita:

De En
sbyte byte, ushort, uint, ulong o nuint
byte sbyte
short sbyte, byte, ushort, uint, ulong o nuint
ushort sbyte, byteo short
int sbyte, byte, short, ushort, uint, ulong o nuint
uint sbyte, byte, short, ushort, int o nint
long sbyte, byte, short, ushort, int, uint, ulong, nint o nuint
ulong sbyte, byte, short, ushort, int, uint, long, nint o nuint
float sbyte, byte, short, ushort, int, uint, long, ulong, decimal, nint o nuint
double sbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint o nuint
decimal sbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint o nuint
nint sbyte, byte, short, ushort, int, uint, ulong o nuint
nuint sbyte, byte, short, ushort, int, uint, long o nint

Nota:

Una conversión numérica explícita podría provocar la pérdida de datos o producir una excepción, normalmente una de tipo OverflowException.

Tenga en cuenta también lo siguiente:

  • Al convertir un valor de tipo entero en otro tipo entero, el resultado depende del contexto de comprobación de desbordamiento. En un contexto comprobado, la conversión se realiza correctamente si el valor de origen está dentro del intervalo del tipo de destino. De lo contrario, se produce una excepción OverflowException. En un contexto no comprobado, la conversión siempre se realiza correctamente y continúa así:

    • Si el tipo de origen es mayor que el tipo de destino, el valor de origen se trunca al descartar sus bits "extra" más significativos. El resultado se trata como un valor del tipo de destino.

    • Si el tipo de origen es menor que el tipo de destino, el valor de origen se amplía mediante signos o ceros para que tenga el mismo tamaño que el tipo de destino. La ampliación mediante signos se usa si el tipo de origen tiene signo; se emplea ampliación mediante ceros si el tipo de origen no tiene signo. El resultado se trata como un valor del tipo de destino.

    • Si el tipo de origen es del mismo tamaño que el tipo de destino, el valor de origen se trata como un valor del tipo de destino.

  • Cuando convierte un valor decimal en un tipo entero, este valor se redondea hacia cero al valor entero más cercano. Si el valor entero resultante está fuera del rango del tipo de destino, se genera una excepción OverflowException.

  • Al convertir un valor double o float en un tipo entero, este valor se redondea hacia cero al valor entero más cercano. Si el valor entero resultante está fuera del intervalo del tipo de destino, el resultado depende del contexto de comprobación de desbordamiento. En un contexto comprobado, se genera una excepción OverflowException, mientras que en un contexto no comprobado, el resultado es un valor no especificado del tipo de destino.

  • Cuando convierte double en float, el valor double se redondea al valor float más cercano. Si el valor double es demasiado pequeño o demasiado grande para adaptarse al tipo float, el resultado será cero o infinito.

  • Cuando convierte float o double en decimal, el valor de origen se convierte en la representación decimal y se redondea al número más cercano después de la posición decimal 28 si es necesario. Dependiendo del valor que tenga el valor de origen, puede producirse uno de los siguientes resultados:

    • Si el valor de origen es demasiado pequeño para representarse como decimal, el resultado se convierte en cero.

    • Si el valor de origen es NaN (no es un número), infinito o demasiado grande para representarse como un decimal, se genera OverflowException.

  • Cuando se convierte decimal en float o double, el valor de origen se redondea al valor float o double más cercano, respectivamente.

Especificación del lenguaje C#

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:

Consulte también