Conversões numéricas incorporadas (referência C#)
C# fornece um conjunto de tipos numéricos integrais e de vírgula flutuante. Existe uma conversão entre quaisquer dois tipos numéricos, implícitos ou explícitos. Você deve usar uma expressão de transmissão para executar uma conversão explícita.
Conversões numéricas implícitas
A tabela a seguir mostra as conversões implícitas predefinidas entre os tipos numéricos internos:
De | Para |
---|---|
Sbyte | short , int , , long , float , decimal double , ounint |
byte | short , ushort , , int , uint , ulong long , float , double , decimal nint ounuint |
curtas | int , long , , double float , ou decimal , ounint |
Ushort | int , uint , , long , float ulong , double , ou decimal , nint ou , ounuint |
Int | long , float , double , ou decimal , nint |
uint | long , ulong , , double float , ou decimal , ounuint |
Longo | float , double ou decimal |
Ulong | float , double ou decimal |
flutuar | double |
Nint | long , float , double , ou decimal |
nuint | ulong , float , double , ou decimal |
Nota
As conversões implícitas de , , , , , ou nuint
para float
e de long
, ulong
, nint
ou nuint
para double
podem causar uma perda de precisão, mas nunca uma perda de uma ordem de grandeza. nint
ulong
long
uint
int
As outras conversões numéricas implícitas nunca perdem nenhuma informação.
Note-se também que
Qualquer tipo numérico integral é implicitamente conversível em qualquer tipo numérico de vírgula flutuante.
Não há conversões implícitas para os
byte
esbyte
tipos. Não há conversões implícitas dosdouble
edecimal
tipos.Não há conversões implícitas entre o tipo e os
decimal
float
tipos oudouble
.Um valor de uma expressão constante do tipo
int
(por exemplo, um valor representado por um literal inteiro) pode ser implicitamente convertido emsbyte
,byte
, ,short
,ushort
uint
,ulong
nint
, , ou , senuint
estiver dentro do intervalo do tipo de destino:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Como mostra o exemplo anterior, se o valor constante não estiver dentro do intervalo do tipo de destino, ocorrerá um erro de compilador CS0031 .
Conversões numéricas explícitas
A tabela a seguir mostra as conversões explícitas predefinidas entre os tipos numéricos internos para os quais não há conversão implícita:
De | Para |
---|---|
Sbyte | byte , ushort , uint , ulong , ou nuint |
byte | sbyte |
curtas | sbyte , byte , , ushort , ulong uint , ounuint |
Ushort | sbyte , byte ou short |
Int | sbyte , byte , , short , ushort , ulong uint , ounuint |
uint | sbyte , byte , , short , int ushort , ounint |
Longo | sbyte , byte , short , ushort , int , uint , ulong , nint ou nuint |
Ulong | sbyte , byte , short , ushort , int , uint , long , nint ou nuint |
flutuar | sbyte , byte , , short , ushort , uint int , long , ulong , decimal nint ounuint |
duplo | sbyte , byte , , short , ushort , uint int , long , ulong , float decimal nint ounuint |
decimal | sbyte , byte , , short , ushort , uint int , long , ulong , float double nint ounuint |
Nint | sbyte , byte , , short , ushort , uint int , ulong , ounuint |
nuint | sbyte , byte , , short , ushort , uint int , long , ounint |
Nota
Uma conversão numérica explícita pode resultar em perda de dados ou lançar uma exceção, normalmente um OverflowExceptionarquivo .
Note-se também que:
Quando você converte um valor de um tipo integral em outro tipo integral, o resultado depende do contexto de verificação de estouro. Em um contexto verificado, a conversão será bem-sucedida se o valor de origem estiver dentro do intervalo do tipo de destino. Caso contrário, um OverflowException é jogado. Em um contexto não verificado, a conversão sempre é bem-sucedida e prossegue da seguinte maneira:
Se o tipo de origem for maior que o tipo de destino, o valor de origem será truncado descartando seus bits "extra" mais significativos. O resultado é então tratado como um valor do tipo de destino.
Se o tipo de origem for menor que o tipo de destino, o valor de origem será estendido por sinal ou zero estendido para que tenha o mesmo tamanho do tipo de destino. A extensão de sinal é usada se o tipo de origem estiver assinado; zero-extension é usado se o tipo de origem não estiver assinado. O resultado é então tratado como um valor do tipo de destino.
Se o tipo de origem for do mesmo tamanho que o tipo de destino, o valor de origem será tratado como um valor do tipo de destino.
Quando você converte um
decimal
valor em um tipo integral, esse valor é arredondado para zero para o valor integral mais próximo. Se o valor integral resultante estiver fora do intervalo do tipo de destino, um OverflowException será lançado.Quando você converte um
double
oufloat
valor em um tipo integral, esse valor é arredondado para zero para o valor integral mais próximo. Se o valor integral resultante estiver fora do intervalo do tipo de destino, o resultado dependerá do contexto de verificação de estouro. Em um contexto verificado, um OverflowException é lançado, enquanto em um contexto não verificado, o resultado é um valor não especificado do tipo de destino.Quando você converte
double
para , odouble
valor é arredondado para o valor mais próximofloat
float
. Se odouble
valor for muito pequeno ou muito grande para caber nofloat
tipo, o resultado será zero ou infinito.Quando você converte
float
oudouble
paradecimal
, o valor de origem é convertido emdecimal
representação e arredondado para o número mais próximo após a 28ª casa decimal, se necessário. Dependendo do valor do valor de origem, um dos seguintes resultados pode ocorrer:Se o valor de origem for muito pequeno para ser representado como um
decimal
, o resultado se tornará zero.Se o valor de origem for NaN (não um número), infinito ou muito grande para ser representado como um
decimal
, um OverflowException é lançado.
Quando você converte
decimal
parafloat
oudouble
, o valor de origem é arredondado para o valor oudouble
mais próximofloat
, respectivamente.
Especificação da linguagem C#
Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#: