Tipos numéricos enteros (referencia de C#)Integral numeric types (C# reference)

Los tipos numéricos enteros son un subconjunto de tipos simples y se pueden inicializar con literales.The integral numeric types are a subset of the simple types and can be initialized with literals. Todos los tipos enteros también son tipos de valor.All integral types are also value types. Todos los tipos numéricos enteros admiten operadores aritméticos, lógicos bit a bit, de comparación e igualdad.All integral numeric types support arithmetic, bitwise logical, comparison, and equality operators.

Características de los tipos enterosCharacteristics of the integral types

C# admite los siguientes tipos enteros predefinidos:C# supports the following predefined integral types:

Palabra clave/tipo de C#C# type/keyword IntervaloRange TamañoSize Tipo de .NET.NET type
sbyte De -128 a 127-128 to 127 Entero de 8 bits con signoSigned 8-bit integer System.SByte
byte De 0 a 2550 to 255 Entero de 8 bits sin signoUnsigned 8-bit integer System.Byte
short De -32 768 a 32 767-32,768 to 32,767 Entero de 16 bits con signoSigned 16-bit integer System.Int16
ushort De 0 a 65.5350 to 65,535 Entero de 16 bits sin signoUnsigned 16-bit integer System.UInt16
int De -2.147.483.648 a 2.147.483.647-2,147,483,648 to 2,147,483,647 Entero de 32 bits con signoSigned 32-bit integer System.Int32
uint De 0 a 4.294.967.2950 to 4,294,967,295 Entero de 32 bits sin signoUnsigned 32-bit integer System.UInt32
long De -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 Entero de 64 bits con signoSigned 64-bit integer System.Int64
ulong De 0 a 18.446.744.073.709.551.6150 to 18,446,744,073,709,551,615 Entero de 64 bits sin signoUnsigned 64-bit integer System.UInt64

En la tabla anterior, cada palabra clave de tipo de C# de la columna ubicada más a la izquierda es un alias del tipo de .NET correspondiente.In the preceding table, each C# type keyword from the leftmost column is an alias for the corresponding .NET type. Son intercambiables.They are interchangeable. Por ejemplo, en las declaraciones siguientes se declaran variables del mismo tipo:For example, the following declarations declare variables of the same type:

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

El valor predeterminado de cada tipo entero es cero, 0.The default value of each integral type is zero, 0. Cada uno de los tipos enteros tiene las constantes MinValue y MaxValue que proporcionan el valor mínimo y máximo de ese tipo.Each of the integral types has the MinValue and MaxValue constants that provide the minimum and maximum value of that type.

Use la estructura System.Numerics.BigInteger para representar un entero con signo sin límite superior ni inferior.Use the System.Numerics.BigInteger structure to represent a signed integer with no upper or lower bounds.

Literales enterosIntegral literals

Los literales enteros pueden especificarse como literales decimales, literales hexadecimales o literales binarios.Integral literals can be specified as decimal literals, hexadecimal literals, or binary literals. A continuación se muestra un ejemplo de cada uno:An example of each is shown below:

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

Los literales decimales no requieren ningún prefijo.Decimal literals don't require any prefix. El prefijo x o X significa un literal hexadecimal.The x or X prefix signifies a hexadecimal literal. El prefijo b o B significa un literal binario.The b or B prefix signifies a binary literal. La declaración de binaryLiteral muestra el uso de _ como un separador de dígitos.The declaration of binaryLiteral demonstrates the use of _ as a digit separator. El separador de dígitos también se puede usar con todos los literales numéricos.The digit separator can be used with all numeric literals. Los literales binarios y el separador de dígitos _ se admiten a partir de C# 7.0.Binary literals and the digit separator _ are supported starting with C# 7.0.

Sufijos literalesLiteral suffixes

El sufijo l o L especifica que el literal entero debe ser del tipo long.The l or L suffix specifies that the integral literal should be of the long type. El sufijo ul o UL especifica el tipo ulong.The ul or UL suffix specifies the ulong type. Si el sufijo L se usa en un literal que es mayor de 9 223 372 036 854 775 807 (el valor máximo de long), el valor se convierte en el 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. Si el valor que representa un literal integral supera UInt64.MaxValue, se produce un error de compilación CS1021.If the value represented by an integral literal exceeds UInt64.MaxValue, a compiler error CS1021 occurs.

Nota

Puede usar la letra minúscula "l" como sufijo,You can use the lowercase letter "l" as a suffix. aunque esto genera una advertencia del compilador porque la letra "l" se confunde fácilmente con el dígito "1".However, this generates a compiler warning because the letter "l" is easily confused with the digit "1." Use "L" para mayor claridad.Use "L" for clarity.

Tipo de un literal enteroType of an integral literal

Si un literal entero no tiene sufijo, su tipo es el primero de los siguientes tipos en el que se puede representar su valor: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

Puede convertir un literal entero en un tipo con un rango menor que el valor predeterminado mediante una asignación o una conversión: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.

Puede convertir un literal entero en un tipo con un rango mayor que el valor predeterminado mediante una asignación, una conversión o un sufijo en el 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;

ConversionesConversions

Hay una conversión implícita (llamada conversión de ampliación) entre los dos tipos enteros donde el tipo de destino puede almacenar todos los valores del tipo de origen.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 ejemplo, hay una conversión implícita de int a long porque el rango de valores de int es un subconjunto apropiado 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. Hay conversiones implícitas de un tipo entero sin signo más pequeño en un tipo entero con signo de mayor tamaño.There are implicit conversions from a smaller unsigned integral type to a larger signed integral type. También hay una conversión implícita de cualquier tipo entero en cualquier tipo de punto flotante.There's also an implicit conversion from any integral type to any floating-point type. No hay ninguna conversión implícita de ningún tipo entero con signo en ningún tipo entero sin signo.There's no implicit conversion from any signed integral type to any unsigned integral type.

Debe usar una conversión explícita para convertir un tipo entero en otro tipo entero cuando no se define una conversión implícita del tipo de origen en el 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. Esto se denomina conversión de restricción.This is called a narrowing conversion. El caso explícito es necesario porque la conversión puede producir pérdida de datos.The explicit case is required because the conversion can result in data loss.

Vea tambiénSee also