Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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, decimaldouble, ounint |
| byte |
short, ushort, , int, uint, ulonglong, float, double, decimalnintounuint |
| curto |
int, long, , doublefloat, ou decimal, ounint |
| Ushort |
int, uint, , long, floatulong, double, ou decimal, nintou , ounuint |
| int |
long, float, double, ou decimal, nint |
| uint |
long, ulong, , doublefloat, ou decimal, 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 , , , , , ou nuint para float e de long, ulong, nintou nuint para double podem causar uma perda de precisão, mas nunca uma perda de uma ordem de grandeza. nintulonglonguintint 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,ushortuint,ulongnint, , ou , senuintestiver 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, ulongou nuint |
| byte | sbyte |
| curto |
sbyte, byte, , ushort, uintulong, ounuint |
| Ushort |
sbyte, byte ou short |
| int |
sbyte, byte, , short, ushort, ulonguint, 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, uintint, long, ulong, decimalnintounuint |
| duplo |
sbyte, byte, , short, ushort, uintint, long, ulong, floatdecimalnintounuint |
| decimal |
sbyte, byte, , short, ushort, uintint, long, ulong, floatdoublenintounuint |
| Nint |
sbyte, byte, , short, ushort, uintint, ulong, ounuint |
| nuint |
sbyte, byte, , short, ushort, uintint, 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 você converte um
decimalvalor 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
doubleoufloatvalor 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
doublepara , odoublevalor é arredondado para o valor mais próximofloatfloat. 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.
Quando você converte
decimalparafloatoudouble, o valor de origem é arredondado para o valor oudoublemais próximofloat, respectivamente.
Especificação da linguagem C#
Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#: