Compartilhar via


Conversões numéricas internas (referência em C#)

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

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

  • Um valor de uma expressão constante de tipo int (por exemplo, um valor representado por um literal inteiro) pode ser convertido sbyteimplicitamente em , , byte, short, ushort, uint, ulong, nintou 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'
    

    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 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á gerado.

  • Quando você converte um double valor ou float um 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 , floato double valor é arredondado para o valor mais próximo float . Se o double valor for muito pequeno ou muito grande para caber no float tipo, o resultado será zero ou infinito.

  • Quando você converte ou double emdecimalfloat, o valor de origem é convertido em decimal representaçã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 decimal ou floatdouble, o valor de origem é arredondado para o valor ou double o 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#:

Consulte também