Tipos numéricos integrais (Referência C#)

Os tipos numéricos integrais representam números inteiros. Todos os tipos numéricos integrais são tipos de valor. Eles também são tipos simples e podem ser inicializados com literais. Todos os tipos numéricos integrais dão suporte a operadores aritméticos, lógicos, de comparaçãoe de igualdade .

Características dos tipos integrais

O C# é compatível com os seguintes tipos integrais predefinidos:

palavra-chave/tipo C# Intervalo Tamanho Tipo .NET
sbyte -128 a 127 Inteiro de 8 bits com sinal System.SByte
byte 0 a 255 Inteiro de 8 bits sem sinal System.Byte
short -32.768 a 32.767 Inteiro de 16 bits com sinal System.Int16
ushort 0 a 65.535 Inteiro de 16 bits sem sinal System.UInt16
int -2.147.483.648 a 2.147.483.647 Inteiro assinado de 32 bits System.Int32
uint 0 a 4.294.967.295 Inteiro de 32 bits sem sinal System.UInt32
long -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Inteiro assinado de 64 bits System.Int64
ulong 0 a 18.446.744.073.709.551.615 Inteiro de 64 bits sem sinal System.UInt64
nint Depende da plataforma Número inteiro de 32 bits ou 64 bits assinado System.IntPtr
nuint Depende da plataforma Inteiro de 32 bits ou 64 bits não assinado System.UIntPtr

Em todas as linhas da tabela, exceto as duas últimas, cada palavra-chave do tipo C# da coluna mais à esquerda é um alias para o tipo .NET correspondente. A palavra-chave e o nome do tipo .NET são intercambiáveis. Por exemplo, as declarações a seguir declaram variáveis do mesmo tipo:

int a = 123;
System.Int32 b = 123;

Os nint nuint tipos e nas duas últimas linhas da tabela são inteiros de tamanho nativo. Eles são representados internamente pelos tipos do .NET indicados, mas, em cada caso, a palavra-chave e o tipo .NET não são intercambiáveis. O compilador fornece operações e conversões para nint e nuint como tipos inteiros que ele não fornece para os tipos de ponteiro System.IntPtr e System.UIntPtr . Para obter mais informações, consulte nint e nuint tipos.

O valor padrão de cada tipo integral é zero, 0. Cada um dos tipos integrais, exceto os tipos de tamanho nativo, tem MinValue e MaxValue constantes que fornecem o valor mínimo e máximo desse tipo.

Use a estrutura System.Numerics.BigInteger para representar um inteiro com sinal sem nenhum limite superior ou inferior.

Literais inteiros

Literais inteiros podem ser

  • decimal: sem nenhum prefixo
  • hexadecimal: com o 0x 0X prefixo ou
  • Binary: com o 0b 0B prefixo ou (disponível em C# 7,0 e posterior)

O código a seguir demonstra um exemplo de cada um:

var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;

O exemplo anterior também mostra o uso de _ como um separador de dígito, que tem suporte a partir do C# 7,0. Você pode usar o separador de dígitos com todos os tipos de literais numéricos.

O tipo de um inteiro literal é determinado por seu sufixo da seguinte maneira:

  • Se o literal não tiver nenhum sufixo, seu tipo será o primeiro dos seguintes tipos em que seu valor pode ser representado: int , uint , long , ulong .

    Observação

    Os literais são interpretados como valores positivos. Por exemplo, o literal 0xFF_FF_FF_FF representa o número 4294967295 do uint tipo, embora tenha a mesma representação de bit que o número -1 do int tipo. Se você precisar de um valor de um determinado tipo, converta um literal para esse tipo. Use o unchecked operador, se um valor literal não puder ser representado no tipo de destino. Por exemplo, unchecked((int)0xFF_FF_FF_FF) produz -1 .

  • Se o literal for sufixado pelo U ou u , seu tipo será o primeiro dos seguintes tipos em que seu valor pode ser representado: uint , ulong .

  • Se o literal for sufixado pelo L ou l , seu tipo será o primeiro dos seguintes tipos em que seu valor pode ser representado: long , ulong .

    Observação

    Você pode usar a letra minúscula l como um sufixo. No entanto, isso gera um aviso do compilador porque a letra l pode ser confundida com o dígito 1 . Use L para obter clareza.

  • Se o literal for sufixado por,,,,,, UL Ul uL ul LU Lu lU ou lu , seu tipo é ulong .

Se o valor representado por um literal inteiro exceder UInt64.MaxValue, ocorrerá um erro de compilador CS1021.

Se o tipo determinado de um literal inteiro for int e o valor representado pelo literal estiver dentro do intervalo do tipo de destino, o valor poderá ser convertido implicitamente em sbyte , byte ,,,, short ushort uint ulong nint ou nuint :

byte a = 17;
byte b = 300;   // CS0031: Constant value '300' cannot be converted to a 'byte'

Como mostra o exemplo anterior, se o valor do literal não estiver dentro do intervalo do tipo de destino, ocorrerá um erro de compilador CS0031 .

Você também pode usar uma conversão para converter o valor representado por um literal inteiro para o tipo diferente do tipo determinado do literal:

var signedByte = (sbyte)42;
var longVariable = (long)42;

Conversões

Você pode converter qualquer tipo numérico integral para qualquer outro tipo numérico integral. Se o tipo de destino puder armazenar todos os valores do tipo de origem, a conversão será implícita. Caso contrário, você precisa usar uma expressão CAST para executar uma conversão explícita. Para obter mais informações, consulte conversões numéricas internas.

Especificação da linguagem C#

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

Confira também