Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
C# fornece um conjunto de tipos numéricos integrais e de vírgula flutuante . Existe uma conversão implícita ou explícita entre quaisquer dois tipos numéricos. Use uma expressão cast para realizar uma conversão explícita.
A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento linguístico.
A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.
Sugestão
Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.
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, doubledecimal, ounint |
| byte |
short, ushort, , int, uint, longulong, float, double, decimalnintounuint |
| curto |
int, long, , float, doubledecimal, ounint |
| Ushort |
int, uint, , long, ulong, float, doubledecimal, nint, ounuint |
| int |
long, float, double, decimalou nint |
| uint |
long, ulong, , float, doubledecimal, ounuint |
| Longo |
float, double ou decimal |
| Ulong |
float, double ou decimal |
| float | double |
| Nint |
long, float, doubleou decimal |
| nuint |
ulong, float, doubleou decimal |
Observação
As conversões implícitas de int, uint, long, ulong, nint, 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. 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
byteesbytetipos. Não há conversões implícitas dosdoubleedecimaltipos.Não há conversões implícitas entre o tipo e os
decimalfloattipos 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,uintulong, ,nint, , ounuintse estiver dentro do intervalo do tipo de destino:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Se o valor constante não estiver dentro do intervalo do tipo de destino, ocorre o erro do compilador CS0031 .
Conversões numéricas explícitas
A tabela seguinte mostra as conversões explícitas pré-definidas entre os tipos numéricos incorporados para as quais não existe conversão implícita:
| De | Para |
|---|---|
| Sbyte |
byte, ushort, uint, ulongou nuint |
| byte | sbyte |
| curto |
sbyte, byte, , ushort, uintulong, ounuint |
| Ushort |
sbyte, byte ou short |
| int |
sbyte, byte, , short, ushort, uintulong, ounuint |
| uint |
sbyte, byte, , short, ushortint, ounint |
| Longo |
sbyte, byte, , short, ushort, int, uintulong, nint, ounuint |
| Ulong |
sbyte, byte, , short, ushort, int, uintlong, nint, ounuint |
| float |
sbyte, byte, , short, ushort, intuint, long, ulong, decimalnintounuint |
| duplo |
sbyte, byte, , short, ushort, intuint, long, ulong, floatdecimalnintounuint |
| decimal |
sbyte, byte, , short, ushort, intuint, long, ulong, floatdoublenintounuint |
| Nint |
sbyte, byte, , short, ushort, intuint, ulong, ounuint |
| nuint |
sbyte, byte, , short, ushort, intuint, long, ounint |
Observação
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 é lançado. 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 é estendido por sinal ou por zeros para ficar com 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 se converte um
decimalvalor para um tipo integral, este valor é arredondado para zero até ao valor integral mais próximo. Se o valor integral resultante estiver fora do intervalo do tipo de destino, um OverflowException será lançado.Quando converte um
doublevalor oufloatnum tipo de integral, este 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
doublepara , ofloatvalor é arredondado para o valor mais próximodoublefloat. Se odoublevalor for muito pequeno ou muito grande para caber nofloattipo, o resultado será zero ou infinito.Quando você converte
floatoudoubleparadecimal, o valor de origem é convertido emdecimalrepresentaçã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.
- Se o valor de origem for muito pequeno para ser representado como um
Quando você converte
decimalparafloatoudouble, o valor de origem é arredondado para o valor oufloatmais próximodouble, respectivamente.
Especificação da linguagem C#
Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#: