Conversiones numéricas integradas (referencia de C#)Built-in numeric conversions (C# reference)

C# proporciona un conjunto de tipos numéricos enteros y de punto flotante.C# provides a set of integral and floating-point numeric types. Existe una conversión entre dos tipos numéricos, ya sea implícita o explícita.There exists a conversion between any two numeric types, either implicit or explicit. Debe usar una expresión Cast para realizar una conversión explícita.You must use a cast expression to perform an explicit conversion.

Conversiones numéricas implícitasImplicit numeric conversions

En la tabla siguiente se muestran las conversiones implícitas predefinidas entre los tipos numéricos integrados:The following table shows the predefined implicit conversions between the built-in numeric types:

DeFrom EnTo
sbytesbyte short, int, long, float, double, decimal o nintshort, int, long, float, double, decimal, or nint
bytebyte short, ushort, int, uint, long, ulong, float, double, decimal, nint o nuintshort, ushort, int, uint, long, ulong, float, double, decimal, nint, or nuint
shortshort int, long, float, double, o decimal, o nintint, long, float, double, or decimal, or nint
ushortushort int, uint, long, ulong, float, double, o decimal, nint, o nuintint, uint, long, ulong, float, double, or decimal, nint, or nuint
intint long, float, double, o decimal, nintlong, float, double, or decimal, nint
uintuint long, ulong, float, double, o decimal, o nuintlong, ulong, float, double, or decimal, or nuint
longlong float, doubleo decimalfloat, double, or decimal
ulongulong float, doubleo decimalfloat, double, or decimal
floatfloat double
nintnint long, float, double o decimallong, float, double, or decimal
nuintnuint ulong, float, double o decimalulong, float, double, or 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.The implicit conversions from int, uint, long, ulong, nint, or nuint to float and from long, ulong, nint, or nuint to double may cause a loss of precision, but never a loss of an order of magnitude. El resto de conversiones numéricas implícitas nunca pierden información.The other implicit numeric conversions never lose any information.

Tenga en cuenta también lo siguiente:Also note that

  • Cualquier tipo numérico entero es implícitamente convertible en cualquier tipo numérico de punto flotante.Any integral numeric type is implicitly convertible to any floating-point numeric type.

  • No hay ninguna conversión implícita a los tipos byte y sbyte.There are no implicit conversions to the byte and sbyte types. No hay ninguna conversión implícita de los tipos double y decimal.There are no implicit conversions from the double and decimal types.

  • No hay ninguna conversión implícita entre el tipo decimal y el tipo float o double.There are no implicit conversions between the decimal type and the float or double types.

  • 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:A value of a constant expression of type int (for example, a value represented by an integer literal) can be implicitly converted to sbyte, byte, short, ushort, uint, ulong, nint, or nuint, if it's within the range of the destination type:

    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.As the preceding example shows, if the constant value is not within the range of the destination type, a compiler error CS0031 occurs.

Conversiones numéricas explícitasExplicit numeric conversions

La siguiente tabla muestra las conversiones explícitas predefinidas entre tipos numéricos integrados para los que no hay ninguna conversión implícita:The following table shows the predefined explicit conversions between the built-in numeric types for which there is no implicit conversion:

DeFrom EnTo
sbytesbyte byte, ushort, uint, o ulong, o nuintbyte, ushort, uint, or ulong, or nuint
bytebyte sbyte
shortshort sbyte, byte, ushort, uint, ulong o nuintsbyte, byte, ushort, uint, ulong, or nuint
ushortushort sbyte, byteo shortsbyte, byte, or short
intint sbyte, byte, short, ushort, uint, ulong o nuintsbyte, byte, short, ushort, uint, ulong, or nuint
uintuint sbyte, byte, short, ushort o intsbyte, byte, short, ushort, or int
longlong sbyte, byte, short, ushort, int, uint, ulong, nint o nuintsbyte, byte, short, ushort, int, uint, ulong, nint, or nuint
ulongulong sbyte, byte, short, ushort, int, uint, long, nint o nuintsbyte, byte, short, ushort, int, uint, long, nint, or nuint
floatfloat sbyte, byte, short, ushort, int, uint, long, ulong, decimal, nint o nuintsbyte, byte, short, ushort, int, uint, long, ulong, decimal, nint, or nuint
doubledouble sbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint o nuintsbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint, or nuint
decimaldecimal sbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint o nuintsbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint, or nuint
nintnint sbyte, byte, short, ushort, int, uint, ulong o nuintsbyte, byte, short, ushort, int, uint, ulong, or nuint
nuintnuint sbyte, byte, short, ushort, int, uint, long o nintsbyte, byte, short, ushort, int, uint, long, or 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.An explicit numeric conversion might result in data loss or throw an exception, typically an OverflowException.

Tenga en cuenta también lo siguiente:Also note that

  • Al convertir un valor de tipo entero en otro tipo entero, el resultado depende del contexto de comprobación de desbordamiento.When you convert a value of an integral type to another integral type, the result depends on the overflow checking context. En un contexto comprobado, la conversión se realiza correctamente si el valor de origen está dentro del intervalo del tipo de destino.In a checked context, the conversion succeeds if the source value is within the range of the destination type. De lo contrario, se produce una excepción OverflowException.Otherwise, an OverflowException is thrown. En un contexto no comprobado, la conversión siempre se realiza correctamente y continúa así:In an unchecked context, the conversion always succeeds, and proceeds as follows:

    • 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.If the source type is larger than the destination type, then the source value is truncated by discarding its "extra" most significant bits. El resultado se trata como un valor del tipo de destino.The result is then treated as a value of the destination type.

    • 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.If the source type is smaller than the destination type, then the source value is either sign-extended or zero-extended so that it's of the same size as the destination type. 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.Sign-extension is used if the source type is signed; zero-extension is used if the source type is unsigned. El resultado se trata como un valor del tipo de destino.The result is then treated as a value of the destination type.

    • 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.If the source type is the same size as the destination type, then the source value is treated as a value of the destination type.

  • Cuando convierte un valor decimal en un tipo entero, este valor se redondea hacia cero al valor entero más cercano.When you convert a decimal value to an integral type, this value is rounded towards zero to the nearest integral value. Si el valor entero resultante está fuera del rango del tipo de destino, se genera una excepción OverflowException.If the resulting integral value is outside the range of the destination type, an OverflowException is thrown.

  • Al convertir un valor double o float en un tipo entero, este valor se redondea hacia cero al valor entero más cercano.When you convert a double or float value to an integral type, this value is rounded towards zero to the nearest integral value. Si el valor entero resultante está fuera del intervalo del tipo de destino, el resultado depende del contexto de comprobación de desbordamiento.If the resulting integral value is outside the range of the destination type, the result depends on the overflow checking context. 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.In a checked context, an OverflowException is thrown, while in an unchecked context, the result is an unspecified value of the destination type.

  • Cuando convierte double en float, el valor double se redondea al valor float más cercano.When you convert double to float, the double value is rounded to the nearest float value. Si el valor double es demasiado pequeño o demasiado grande para adaptarse al tipo float, el resultado será cero o infinito.If the double value is too small or too large to fit into the float type, the result is zero or infinity.

  • 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.When you convert float or double to decimal, the source value is converted to decimal representation and rounded to the nearest number after the 28th decimal place if required. Dependiendo del valor que tenga el valor de origen, puede producirse uno de los siguientes resultados:Depending on the value of the source value, one of the following results may occur:

    • Si el valor de origen es demasiado pequeño para representarse como decimal, el resultado se convierte en cero.If the source value is too small to be represented as a decimal, the result becomes zero.

    • Si el valor de origen es NaN (no es un número), infinito o demasiado grande para representarse como un decimal, se genera OverflowException.If the source value is NaN (not a number), infinity, or too large to be represented as a decimal, an OverflowException is thrown.

  • Cuando se convierte decimal en float o double, el valor de origen se redondea al valor float o double más cercano, respectivamente.When you convert decimal to float or double, the source value is rounded to the nearest float or double value, respectively.

Especificación del lenguaje C#C# language specification

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:For more information, see the following sections of the C# language specification:

Vea tambiénSee also