Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O C# fornece um conjunto de tipos numéricos de ponto integral e flutuante . Existe uma conversão entre dois tipos numéricos, implícitos ou explícitos. Você deve usar uma expressão de conversã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, double, , decimalou nint |
| byte |
short, ushort, int, uint, , long, ulong, float, double, , decimal, , nintou nuint |
| curto |
int, long, float, doubleou decimal, ou nint |
| ushort |
int, uint, long, ulong, float, double, ou decimal, nintou , ou nuint |
| int |
long, float, doubleou decimal, nint |
| de tonalidade |
long, ulong, float, doubleou decimal, ou nuint |
| 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, longulong, nintou nuint de longe para float , ulongou para , nintou nuint para double pode causar uma perda de precisão, mas nunca uma perda de uma ordem de magnitude. As outras conversões numéricas implícitas nunca perdem nenhuma informação.
Observe também que
Qualquer tipo numérico integral é implicitamente conversível para qualquer tipo numérico de ponto flutuante.
Não há conversões implícitas nos tipos e
sbytenosbytetipos. Não há conversões implícitas do tipo e dodoubletipodecimal.Não há conversões implícitas entre o
decimaltipo e osfloattipos oudouble.Um valor de uma expressão constante de tipo
int(por exemplo, um valor representado por um literal inteiro) pode ser convertidosbyteimplicitamente em , ,byte,short,ushort,uint,ulong,nintounuint, se 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 da constante não estiver dentro do intervalo do tipo de destino, ocorrerá um erro do 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 |
| curto |
sbyte, , byteushort, uint, ulongounuint |
| ushort |
sbyte, byte ou short |
| int |
sbyte, byte, short, ushort, uint, , ulongou nuint |
| de tonalidade |
sbyte, , byteshort, ushort, intounint |
| longo |
sbyte, byte, short, ushort, int, , uint, ulong, nint, ou nuint |
| ulong |
sbyte, byte, short, ushort, int, , uint, long, nint, ou nuint |
| float |
sbyte, byte, short, ushort, , int, uint, long, ulong, , decimal, , nintou nuint |
| duplo |
sbyte, byte, short, ushort, , int, uint, , longulong, , float, , decimal, , nintounuint |
| decimal |
sbyte, byte, short, ushort, , int, uint, , longulong, , float, , double, , nintounuint |
| nint |
sbyte, byte, short, ushort, int, , uint, ulongou nuint |
| nuint |
sbyte, byte, short, ushort, int, , uint, longou nint |
Observação
Uma conversão numérica explícita pode resultar em perda de dados ou gerar uma exceção, normalmente uma OverflowException.
Observe 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 será lançado. Em um contexto desmarcado, 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 "extras" 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 estendido zero para que ele tenha o mesmo tamanho do tipo de destino. A extensão de sinal será usada se o tipo de origem for assinado. A extensão zero será usada 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á gerado.Quando você converte um
doublevalor oufloatum 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 é gerado, enquanto em um contexto desmarcado, o resultado é um valor não especificado do tipo de destino.Quando você converte
double,floatodoublevalor é arredondado para o valor mais próximofloat. Se odoublevalor for muito pequeno ou muito grande para caber nofloattipo, o resultado será zero ou infinito.Quando você converte ou
doubleemdecimalfloat, o valor de origem é convertido emdecimalrepresentação e arredondado para o número mais próximo após o 28º local 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 será gerado.
Quando você converte
decimaloufloatdouble, o valor de origem é arredondado para o valor oudoubleo mais próximofloat, respectivamente.
Especificação da linguagem C#
Para obter mais informações, confira as seguintes seções da especificação da linguagem C#: