Compartir a través de


Conversiones numéricas integradas (referencia de C#)

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

La referencia del lenguaje C# documenta la versión publicada más recientemente del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

Conversiones numéricas implícitas

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

Desde En
sbyte short, int, long, float, double, decimalo nint
de bytes short, ushort, int, uint, long, ulong, floatdouble, , decimal, , nintonuint
breve int, long, float, double, decimalo nint
de ushort int, uint, long, ulong, float, double, decimal, ninto nuint
int long, float, double, decimal o nint
uint long, ulong, float, double, decimalo nuint
long float, double o decimal
ulong float, double o decimal
float double
nint long, float, doubleo decimal
nuint ulong, float, doubleo decimal

Nota:

Las conversiones implícitas de int, uint, long, ulong, ninto nuint a float y de long, ulong, nint, o nuint a double pueden 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 que

  • Cualquier tipo numérico entero se puede convertir implícitamente en cualquier tipo numérico de punto flotante.

  • No hay conversiones implícitas a los byte tipos y sbyte . No hay conversiones implícitas de los double tipos y decimal .

  • No hay conversiones implícitas entre el decimal tipo y los float tipos 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, , shortuintushort, , ulong, , o nintnuint si está dentro del intervalo del tipo de destino:

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

Si el valor constante no está dentro del intervalo del tipo de destino, se produce un error del compilador CS0031 .

Conversiones numéricas explícitas

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

Desde En
sbyte byte, ushort, uint, ulong o nuint
de bytes sbyte
breve sbyte, byte, ushort, uint, ulongo nuint
de ushort sbyte, byte o short
int sbyte, byte, short, ushort, uint, ulongo nuint
uint sbyte, byte, short, ushort, into nint
long sbyte, byte, short, ushort, int, uint, ulong, ninto nuint
ulong sbyte, byte, short, ushort, int, uint, long, ninto nuint
float sbyte, byte, short, ushort, int, uint, longulong, , decimal, , nintonuint
double sbyte, byte, short, ushort, int, uint, long, ulongfloat, , decimalnintonuint
decimal sbyte, byte, short, ushort, int, uint, long, ulongfloat, , doublenintonuint
nint sbyte, byte, short, ushort, int, uint, ulongo nuint
nuint sbyte, byte, short, ushort, int, uint, longo nint

Nota:

Una conversión numérica explícita podría dar lugar a una pérdida de datos o producir una excepción, normalmente una OverflowExceptionexcepción .

Tenga en cuenta también que:

  • Cuando se convierte un valor de un 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 sin restricciones, la conversión siempre tiene éxito y continúa de la siguiente manera:

    • Si el tipo de origen es más grande que el tipo de destino, el valor de origen se trunca descartando sus bits más significativos adicionales. El resultado se trata como un valor del tipo de destino.
    • Si el tipo de origen es más pequeño que el tipo de destino, entonces el valor de origen se amplía mediante extensión de signo o extensión con ceros para que tenga el mismo tamaño que el tipo de destino. La extensión de signo se usa si el tipo de origen es con signo; la extensión con ceros se usa si el tipo de origen es sin signo. El resultado se trata como un valor del tipo de destino.
    • Si el tipo de origen tiene el mismo tamaño que el tipo de destino, el valor de origen se trata como un valor del tipo de destino.
  • Al convertir un decimal valor en un tipo entero, este valor se redondea hacia cero hasta el valor entero más cercano. Si el valor entero resultante está fuera del intervalo del tipo de destino, se produce una OverflowException excepción .

  • Al convertir un double valor o float en un tipo entero, este valor se redondea hacia cero hasta el 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 produce una OverflowException excepción , mientras que en un contexto no comprobado, el resultado es un valor no especificado del tipo de destino.

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

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

    • Si el valor de origen es demasiado pequeño para representarse como , decimalel resultado se convierte en cero.
    • Si el valor de origen es NaN (no un número), infinito o demasiado grande para representarse como , se produce una decimalOverflowException excepción .
  • Cuando se convierte decimal en float o double, el valor de origen se redondea al valor más cercano float o double , 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