Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
bytetipos ysbyte. No hay conversiones implícitas de losdoubletipos ydecimal.No hay conversiones implícitas entre el
decimaltipo y losfloattipos odouble.Un valor de una expresión constante de tipo
int(por ejemplo, un valor representado por un literal entero) se puede convertir implícitamente ensbyte,byte,uintushortulongshortnintonuint, 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
decimalvalor 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
doublevalor ofloaten 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
doubleenfloat, eldoublevalor se redondea al valor másfloatcercano. Si eldoublevalor es demasiado pequeño o demasiado grande para ajustarse alfloattipo, el resultado es cero o infinito.Al convertir
floatodoubleendecimal, el valor de origen se convierte endecimalrepresentació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
decimalenfloatodouble, el valor de origen se redondea al valor más cercanofloatodouble, respectivamente.
Especificación del lenguaje C#
Para más información, vea las secciones siguientes de la Especificación del lenguaje C#: