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 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
curtas 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
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, 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 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, ushortuint, ulongnint, , ou , se nuintestiver 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, ulonguint, ounuint
Ushort sbyte, byte ou short
Int sbyte, byte, , short, ushort, ulonguint, ounuint
uint sbyte, byte, , short, intushort, 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, 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

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 ou float 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 , o double valor é arredondado para o valor mais próximo floatfloat. 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 double 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#:

Consulte também