Tipos numéricos integrais (Referência C#)Integral numeric types (C# reference)

Os tipos numéricos integrais são um subconjunto de tipos simples e podem ser inicializados com literais.The integral numeric types are a subset of the simple types and can be initialized with literals. Todos os tipos integrais também são tipos de valor.All integral types are also value types. Todos os tipos numéricos integrais dão suporte a operadores aritméticos, bit a bit lógicos, de comparação e igualdade.All integral numeric types support arithmetic, bitwise logical, comparison, and equality operators.

Características dos tipos integraisCharacteristics of the integral types

O C# é compatível com os seguintes tipos integrais predefinidos:C# supports the following predefined integral types:

palavra-chave/tipo C#C# type/keyword IntervaloRange TamanhoSize Tipo .NET.NET type
sbyte -128 a 127-128 to 127 Inteiro de 8 bits com sinalSigned 8-bit integer System.SByte
byte 0 a 2550 to 255 Inteiro de 8 bits sem sinalUnsigned 8-bit integer System.Byte
short -32.768 a 32.767-32,768 to 32,767 Inteiro de 16 bits com sinalSigned 16-bit integer System.Int16
ushort 0 a 65.5350 to 65,535 Inteiro de 16 bits sem sinalUnsigned 16-bit integer System.UInt16
int -2.147.483.648 a 2.147.483.647-2,147,483,648 to 2,147,483,647 Inteiro de 32 bits com sinalSigned 32-bit integer System.Int32
uint 0 a 4.294.967.2950 to 4,294,967,295 Inteiro de 32 bits sem sinalUnsigned 32-bit integer System.UInt32
long -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Inteiro de 64 bits com sinalSigned 64-bit integer System.Int64
ulong 0 a 18.446.744.073.709.551.6150 to 18,446,744,073,709,551,615 Inteiro de 64 bits sem sinalUnsigned 64-bit integer System.UInt64

Na tabela anterior, cada palavra-chave do tipo C# da coluna mais à esquerda é um alias do tipo .NET correspondente.In the preceding table, each C# type keyword from the leftmost column is an alias for the corresponding .NET type. Eles são intercambiáveis.They are interchangeable. Por exemplo, as declarações a seguir declaram variáveis do mesmo tipo:For example, the following declarations declare variables of the same type:

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

O valor padrão de cada tipo integral é zero, 0.The default value of each integral type is zero, 0. Cada um dos tipos integrais possui as constantes MinValue e MaxValue que fornecem o valor mínimo e máximo desse tipo.Each of the integral types has the MinValue and MaxValue constants that provide the minimum and maximum value of that type.

Use a estrutura System.Numerics.BigInteger para representar um inteiro com sinal sem nenhum limite superior ou inferior.Use the System.Numerics.BigInteger structure to represent a signed integer with no upper or lower bounds.

Literais integraisIntegral literals

Os literais integrais podem ser especificados como literais decimais, literais hexadecimais ou literais binários.Integral literals can be specified as decimal literals, hexadecimal literals, or binary literals. Abaixo, um exemplo de cada:An example of each is shown below:

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

Literais decimais não exigem nenhum prefixo.Decimal literals don't require any prefix. O prefixo x ou X significa um literal hexadecimal.The x or X prefix signifies a hexadecimal literal. O prefixo b ou B significa um literal binário.The b or B prefix signifies a binary literal. A declaração de binaryLiteral demonstra o uso de _ como um separador de dígito.The declaration of binaryLiteral demonstrates the use of _ as a digit separator. O separador de dígito pode ser usado com todos os literais numéricos.The digit separator can be used with all numeric literals. Os literais binários e o separador de dígitos _ são compatíveis a partir do C# 7.0.Binary literals and the digit separator _ are supported starting with C# 7.0.

Sufixos literaisLiteral suffixes

O sufixo l ou L especifica que o literal integral deve ser do tipo long.The l or L suffix specifies that the integral literal should be of the long type. O sufixo ul ou UL especifica o tipo ulong.The ul or UL suffix specifies the ulong type. Se o sufixo L for usado em um literal maior que 9.223.372.036.854.775.807 (o valor máximo de long), o valor será convertido para o tipo ulong.If the L suffix is used on a literal that is greater than 9,223,372,036,854,775,807 (the maximum value of long), the value is converted to the ulong type. Se o valor representado por um literal integral exceder UInt64.MaxValue, ocorrerá um erro de compilador CS1021.If the value represented by an integral literal exceeds UInt64.MaxValue, a compiler error CS1021 occurs.

Observação

Você pode usar a letra minúscula "l" como sufixo.You can use the lowercase letter "l" as a suffix. No entanto, isso gera um aviso do compilador porque a letra "l" é facilmente confundida com o dígito "1".However, this generates a compiler warning because the letter "l" is easily confused with the digit "1." Use "L" para fins de clareza.Use "L" for clarity.

Tipo de um literal integralType of an integral literal

Se um literal integral não tiver sufixo, seu tipo será o primeiro dos tipos a seguir em que seu valor pode ser representado:If an integral literal has no suffix, its type is the first of the following types in which its value can be represented:

  1. int
  2. uint
  3. long
  4. ulong

Você pode converter um literal integral em um tipo com um intervalo menor que o padrão usando uma atribuição ou uma conversão:You can convert an integral literal to a type with a smaller range than the default using either an assignment or a cast:

byte byteVariable = 42; // type is byte
var signedByte = (sbyte)42; // type is sbyte.

Você pode converter um literal integral em um tipo com um intervalo maior que o padrão usando uma atribuição, uma conversão ou um sufixo no literal:You can convert an integral literal to a type with a larger range than the default using either assignment, a cast, or a suffix on the literal:

var unsignedLong = 42UL;
var longVariable = 42L;
ulong anotherUnsignedLong = 42;
var anotherLong = (long)42;

ConversõesConversions

Há uma conversão implícita (chamada de conversão de ampliação) entre quaisquer dois tipos integrais, nos quais o tipo de destino pode armazenar todos os valores do tipo de origem.There's an implicit conversion (called a widening conversion) between any two integral types where the destination type can store all values of the source type. Por exemplo, há uma conversão implícita de int até long porque o intervalo dos valores de int é um subconjunto adequado de long.For example, there's an implicit conversion from int to long because the range of int values is a proper subset of long. Não há conversões implícitas de um tipo integral sem sinal menor para um tipo integral com sinal maior.There are implicit conversions from a smaller unsigned integral type to a larger signed integral type. Também há uma conversão implícita de qualquer tipo integral para qualquer tipo de ponto flutuante.There's also an implicit conversion from any integral type to any floating-point type. Não há conversões implícitas de qualquer tipo integral com sinal para qualquer tipo integral sem sinal.There's no implicit conversion from any signed integral type to any unsigned integral type.

Você deverá usar uma conversão explícita para converter um tipo integral em outro tipo integral quando uma conversão implícita não for definida por meio do tipo de fonte para o tipo de destino.You must use an explicit cast to convert one integral type to another integral type when an implicit conversion is not defined from the source type to the destination type. Isso é chamado de conversão de estreitamento.This is called a narrowing conversion. O caso explícito é necessário porque a conversão pode resultar em perda de dados.The explicit case is required because the conversion can result in data loss.

Consulte tambémSee also