Tipos numéricos enteros (referencia de C#)

Los tipos numéricos integrales representan números enteros. Todos los tipos numéricos integrales son tipos de valor. También son tipos simples y se pueden inicializar con literales. Todos los tipos numéricos enteros admiten operadores aritméticos, lógicos bit a bit, de comparación y de igualdad.

Características de los tipos enteros

C# admite los siguientes tipos enteros predefinidos:

Palabra clave/tipo de C# Intervalo Tamaño Tipo de .NET
sbyte De -128 a 127 Entero de 8 bits con signo System.SByte
byte De 0 a 255 Entero de 8 bits sin signo System.Byte
short De -32 768 a 32 767 Entero de 16 bits con signo System.Int16
ushort De 0 a 65.535 Entero de 16 bits sin signo System.UInt16
int De -2.147.483.648 a 2.147.483.647 Entero de 32 bits con signo System.Int32
uint De 0 a 4.294.967.295 Entero de 32 bits sin signo System.UInt32
long De -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Entero de 64 bits con signo System.Int64
ulong De 0 a 18.446.744.073.709.551.615 Entero de 64 bits sin signo System.UInt64
nint Depende de la plataforma Entero de 64 bits o 32 bits con signo System.IntPtr
nuint Depende de la plataforma Entero de 64 bits o 32 bits sin signo System.UIntPtr

En todas las filas de la tabla, excepto en las dos últimas, cada palabra clave de tipo de C# de la columna situada más a la izquierda es un alias del tipo de .NET correspondiente. La palabra clave y el nombre de tipo de .NET son intercambiables. Por ejemplo, en las declaraciones siguientes se declaran variables del mismo tipo:

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

Los tipos nint y nuint de las dos últimas filas de la tabla son enteros de tamaño nativo. Se representan internamente por los tipos de .NET indicados, pero, en cada caso, la palabra clave y el tipo de .NET no son intercambiables. El compilador proporciona operaciones y conversiones para nint y nuint como tipos enteros que no proporciona para los tipos de puntero System.IntPtr y System.UIntPtr. Para obtener más información, consulte los tipos nint y nuint.

El valor predeterminado de cada tipo entero es cero, 0. Cada uno de los tipos enteros, excepto los tipos de tamaño nativo, tiene las constantes MinValue y MaxValue que proporcionan el valor mínimo y máximo de ese tipo.

Use la estructura System.Numerics.BigInteger para representar un entero con signo sin límite superior ni inferior.

Literales enteros

Los literales enteros pueden ser

  • decimales: sin ningún prefijo
  • hexadecimales: con el prefijo de 0x o 0X
  • binarios: con el prefijo 0b o 0B (disponible en C# 7.0 y versiones posteriores)

En el código siguiente se muestra un ejemplo de cada uno de ellos:

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

En el ejemplo anterior también se muestra el uso de _ como un separador de dígitos, que se admite a partir de C# 7.0. Puede usar el separador de dígitos con todos los tipos de literales numéricos.

El tipo de un literal entero viene determinado por su sufijo, como se indica a continuación:

  • Si el literal no tiene sufijo, su tipo es el primero de los siguientes tipos en el que se puede representar su valor: int, uint, long, ulong.

    Nota

    Los literales se interpretan como valores positivos. Por ejemplo, el literal 0xFF_FF_FF_FF representa el número 4294967295 del tipo uint, aunque tiene la misma representación de bits que el número -1 del tipo int. Si necesita un valor de un tipo determinado, convierta un literal en ese tipo. Use el operador unchecked si un valor literal no se puede representar en el tipo de destino. Por ejemplo, unchecked((int)0xFF_FF_FF_FF) genera -1.

  • Si un literal entero tiene el sufijo U o u, su tipo es el primero de los siguientes tipos en el que se puede representar su valor: uint, ulong.

  • Si un literal entero tiene el sufijo L o l, su tipo es el primero de los siguientes tipos en el que se puede representar su valor: long, ulong.

    Nota

    Puede usar la letra minúscula l como sufijo. Sin embargo, esto genera una advertencia del compilador porque la letra l se confunde fácilmente con el dígito 1. Use L para mayor claridad.

  • Si el literal tiene como sufijo UL, Ul, uL, ul, LU, Lu, lU o lu, su tipo es ulong.

Si el valor que representa un literal entero supera UInt64.MaxValue, se produce un error de compilación CS1021.

Si el tipo determinado de un literal entero es int y el valor que representa el literal está dentro del rango del tipo de destino, el valor se puede convertir de forma implícita en sbyte, byte, short, ushort, uint, ulong, nint o nuint:

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

Como se muestra en el ejemplo anterior, si el valor del literal no está dentro del intervalo del tipo de destino, se produce el error CS0031 del compilador.

También puede usar una conversión para convertir el valor representado por un literal entero en un tipo que no sea el determinado del literal:

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

Conversiones

Puede convertir un tipo numérico entero en cualquier otro tipo numérico entero. Si el tipo de destino puede almacenar todos los valores del tipo de origen, la conversión es implícita. De lo contrario, debe usar una expresión Cast para realizar una conversión explícita. Para obtener más información, consulte Conversiones numéricas integradas.

Especificación del lenguaje C#

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:

Vea también