Partilhar via


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 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 byte e sbyte tipos. Não há conversões implícitas dos double e decimal tipos.

  • Não há conversões implícitas entre o tipo e os decimalfloat tipos ou double .

  • Um valor de uma expressão constante do tipo int (por exemplo, um valor representado por um literal inteiro) pode ser implicitamente convertido em sbyte, byte, short, ushort, uintulong, , nint, , ou nuint 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'
    

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 decimal valor 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 double valor ou float num 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 double para , o float valor é arredondado para o valor mais próximo doublefloat. Se o double valor for muito pequeno ou muito grande para caber no float tipo, o resultado será zero ou infinito.

  • Quando você converte float ou double para decimal, o valor de origem é convertido em decimal 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 para float ou double, o valor de origem é arredondado para o valor ou float mais próximodouble, respectivamente.

Especificação da linguagem C#

Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#:

Ver também