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 , double o decimal |
ulong | float , double o 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 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 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
ysbyte
. No hay ninguna conversión implícita de los tiposdouble
ydecimal
.No hay ninguna conversión implícita entre el tipo
decimal
y el tipofloat
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
,short
,ushort
,uint
,ulong
,nint
onuint
, 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 , byte o 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
ofloat
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
enfloat
, el valordouble
se redondea al valorfloat
más cercano. Si el valordouble
es demasiado pequeño o demasiado grande para adaptarse al tipofloat
, el resultado será cero o infinito.Cuando convierte
float
odouble
endecimal
, el valor de origen se convierte en la representacióndecimal
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
enfloat
odouble
, el valor de origen se redondea al valorfloat
odouble
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#: