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 entre dos tipos numéricos, implícitos o explícitos. Debe usar una expresión de conversión 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:

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, doubleo , o decimalnint
de ushort int, uint, long, ulong, float, doubleo decimal, ninto nuint
int long, float, doubleo decimal, nint
uint long, ulong, float, doubleo , o decimalnuint
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, ninto 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, uintushortulongshortninto nuint, 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'
    

    Como se muestra en el ejemplo anterior, 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 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 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