En informática, un número entero es un dato de tipo integral , un tipo de datos que representa un rango de números enteros matemáticos . Los tipos de datos integrales pueden tener distintos tamaños y pueden contener o no valores negativos. Los números enteros se representan comúnmente en una computadora como un grupo de dígitos binarios (bits). El tamaño de la agrupación varía, por lo que el conjunto de tamaños de números enteros disponibles varía entre los diferentes tipos de computadoras. El hardware de la computadora casi siempre proporciona una forma de representar un registro de procesador o una dirección de memoria como un número entero.
El valor de un elemento con un tipo integral es el entero matemático al que corresponde. Los tipos integrales pueden ser sin signo (capaces de representar solo números enteros no negativos) o con signo (capaces de representar también números enteros negativos). [1]
Un valor entero se especifica normalmente en el código fuente de un programa como una secuencia de dígitos que opcionalmente tienen como prefijo + o −. Algunos lenguajes de programación permiten otras notaciones, como hexadecimal (base 16) u octal (base 8). Algunos lenguajes de programación también permiten separadores de grupos de dígitos . [2]
La representación interna de este dato es la forma en que se almacena el valor en la memoria de la computadora. A diferencia de los números enteros matemáticos, un dato típico en una computadora tiene un valor mínimo y máximo posibles.
La representación más común de un entero positivo es una cadena de bits , utilizando el sistema de numeración binario . El orden de los bytes de memoria que almacenan los bits varía; consulte endianness . El ancho , la precisión o el bitness [3] de un tipo integral es el número de bits en su representación. Un tipo integral con n bits puede codificar 2 n números; por ejemplo, un tipo sin signo representa típicamente los valores no negativos de 0 a 2 n −1. A veces se utilizan otras codificaciones de valores enteros a patrones de bits, por ejemplo, decimal codificado en binario o código Gray , o como códigos de caracteres impresos como ASCII .
Existen cuatro formas bien conocidas de representar números con signo en un sistema de computación binario. La más común es el complemento a dos , que permite que un tipo integral con signo con n bits represente números desde −2 ( n −1) hasta 2 ( n −1) −1. La aritmética del complemento a dos es conveniente porque existe una correspondencia uno a uno perfecta entre representaciones y valores (en particular, no hay +0 y −0 separados), y porque la suma , la resta y la multiplicación no necesitan distinguir entre tipos con signo y sin signo. Otras posibilidades incluyen el binario desfasado , la magnitud del signo y el complemento a uno .
Algunos lenguajes de programación definen los tamaños de los números enteros de una manera independiente de la máquina; otros tienen definiciones diferentes según el tamaño de palabra del procesador subyacente. No todas las implementaciones de lenguajes definen variables de todos los tamaños de números enteros, y los tamaños definidos pueden no ser distintos en una implementación particular. Un número entero en un lenguaje de programación puede tener un tamaño diferente en un lenguaje diferente, en un procesador diferente o en un contexto de ejecución de diferente bitness; consulte § Palabras.
Algunas arquitecturas informáticas antiguas utilizaban representaciones decimales de números enteros, almacenados en formato decimal codificado en binario (BCD) u otro formato. Estos valores generalmente requieren tamaños de datos de 4 bits por dígito decimal (a veces llamado nibble ), normalmente con bits adicionales para un signo. Muchas CPU modernas proporcionan un soporte limitado para números enteros decimales como un tipo de datos extendido, proporcionando instrucciones para convertir dichos valores a y desde valores binarios. Dependiendo de la arquitectura, los números enteros decimales pueden tener tamaños fijos (por ejemplo, 7 dígitos decimales más un signo caben en una palabra de 32 bits), o pueden tener una longitud variable (hasta un tamaño máximo de dígito), normalmente ocupando dos dígitos por byte (octeto).
Pedazos | Nombre | Rango (asumiendo complemento a dos para ) | Dígitos decimales | Usos | Implementaciones | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
C / C++ | DO# | Pascal y Delfos | Java | SQL [a] | FORTRAN | D | Óxido | |||||
4 | mordisco , semiocteto | Firmado: De −8 a 7, de −(2 3 ) a 2 3 − 1 | 0.9 | Decimal codificado en binario , representación de un solo dígito decimal | — | — | — | — | — | — | — | — |
Sin signo: De 0 a 15, que es igual a 2 4 − 1 | 1.2 | |||||||||||
8 | byte , octeto , i8, u8 | Firmado: De −128 a 127, de −(2 7 ) a 2 7 − 1 | 2.11 | Caracteres ASCII , unidades de código en la codificación de caracteres UTF-8 | int8_t , carácter con signo [b] | sbyte | Abreviatura | byte | diminuto | entero(int8) | byte | i8 |
Sin signo: de 0 a 255, lo que equivale a 2 · 8 − 1 | 2.41 | uint8_t , carácter sin signo [b] | byte | Byte | — | tinyint sin firmar | — | ubyte | u8 | |||
16 | media palabra, palabra , corto, i16, u16 | Firmado: De −32.768 a 32.767, de −(2 15 ) a 2 15 − 1 | 4.52 | Caracteres UCS-2 , unidades de código en la codificación de caracteres UTF-16 | int16_t , corto [b] , int [b] | corto | Pequeñoint | corto | pequeñoint | entero(int16) | corto | i16 |
Sin signo: de 0 a 65.535, que es igual a 2 · 16 − 1 | 4.82 | uint16_t, sin signo [b] , int sin signo [b] | corto | Palabra | carácter [c] | smallint sin signo | — | corto | u16 | |||
32 | palabra, larga , palabra doble, palabra larga, int, i32, u32 | Firmado: De −2.147.483.648 a 2.147.483.647 , de −(2 31 ) a 2 31 − 1 | 9.33 | Caracteres UTF-32 , color verdadero con alfa, FourCC , punteros en computación de 32 bits | int32_t , int [b] , largo [b] | entero | LongInt ; Entero [d] | entero | entero | entero(int32) | entero | i32 |
Sin signo: De 0 a 4.294.967.295, que es igual a 2 · 32 − 1 | 9.63 | uint32_t, sin signo [b] , int sin signo [b] , largo sin signo [b] | unidad | Palabra larga ; Palabra doble ; Cardinal [d] | — | entero sin signo | — | unidad | u32 | |||
64 | palabra, palabra doble, palabra larga, larga, larga larga, cuádruple, palabra cuádruple, qword, int64, i64, u64 | Firmado: De −(2 63 ) a 2 63 − 1 | 18,96 | Tiempo (milisegundos desde la época Unix ), punteros en computación de 64 bits | int64_t , largo [b] , largo largo [b] | largo | Int64 | largo | grande | entero(int64) | largo | i64 |
Sin signo: De 0 a 2 64 − 1 | 19.27 | uint64_t , sin signo largo largo [b] | largo | UInt64 ; PalabraQ | — | bigint sin firmar | — | largo | u64 | |||
128 | octapalabra, doble cuadruplepalabra, i128, u128 | Firmado: De −(2 127 ) a 2 127 − 1 | 38.23 | Cálculos científicos complejos, | C: solo disponible como extensión específica del compilador no estándar | — | — | — | — | — | centavo [e] | i128 |
Sin signo: De 0 a 2 128 − 1 | 38,53 | ucente [e] | u128 | |||||||||
norte | entero de n bits (caso general) | Firmado: −(2 n −1 ) a (2 n −1 − 1) | ( n − 1) logaritmo 10 2 | C23: _BitInt(n) , con signo _BitInt(n) | Ada : rango -2**(n-1)..2**(n-1)-1 | |||||||
Sin signo: 0 a (2 n − 1) | n registro 10 2 | C23: _BitInt(n) sin signo | Ada: rango 0..2**n-1 , mod 2**n ; clases BigDecimal o Decimal de bibliotecas aritméticas arbitrarias de bibliotecas estándar o de terceros en muchos lenguajes como Python, C++, etc. |
Distintas CPU admiten distintos tipos de datos integrales. Normalmente, el hardware admite tanto tipos con signo como sin signo, pero solo un conjunto pequeño y fijo de anchos.
La tabla anterior muestra los anchos de tipo integral que admiten los procesadores comunes en hardware. Los lenguajes de programación de alto nivel ofrecen más posibilidades. Es común tener un tipo integral de "ancho doble" que tiene el doble de bits que el tipo más grande admitido por hardware. Muchos lenguajes también tienen tipos de campo de bits (una cantidad específica de bits, generalmente limitada a ser menor que el ancho máximo admitido por hardware) y tipos de rango (que pueden representar solo los números enteros en un rango específico).
Algunos lenguajes, como Lisp , Smalltalk , REXX , Haskell , Python y Raku , admiten números enteros de precisión arbitraria (también conocidos como números enteros de precisión infinita o bignums ). Otros lenguajes que no admiten este concepto como una construcción de nivel superior pueden tener bibliotecas disponibles para representar números muy grandes utilizando matrices de variables más pequeñas, como la clase BigInteger de Java o el paquete " bigint " de Perl . [6] Estos utilizan tanta memoria de la computadora como sea necesaria para almacenar los números; sin embargo, una computadora solo tiene una cantidad finita de almacenamiento, por lo que también solo pueden representar un subconjunto finito de los números enteros matemáticos. Estos esquemas admiten números muy grandes; por ejemplo, se podría utilizar un kilobyte de memoria para almacenar números de hasta 2466 dígitos decimales.
Un tipo booleano o de bandera es un tipo que puede representar solo dos valores: 0 y 1, generalmente identificados con falso y verdadero respectivamente. Este tipo se puede almacenar en la memoria utilizando un solo bit, pero a menudo se le asigna un byte completo para facilitar el direccionamiento y la velocidad de acceso.
Una cantidad de cuatro bits se conoce como nibble (al comer, es más pequeño que un bocado ) o nybble (es un juego de palabras con la forma de la palabra byte ). Un nibble corresponde a un dígito en hexadecimal y contiene un dígito o un código de signo en decimal codificado en binario.
El término byte inicialmente significaba "la unidad de memoria direccionable más pequeña". En el pasado, se han utilizado bytes de 5, 6, 7, 8 y 9 bits. También ha habido computadoras que podían direccionar bits individuales ("máquinas direccionadas por bits"), o que sólo podían direccionar cantidades de 16 o 32 bits ("máquinas direccionadas por palabras"). El término byte no solía utilizarse en absoluto en relación con las máquinas direccionadas por bits y palabras.
El término octeto siempre se refiere a una cantidad de 8 bits. Se utiliza principalmente en el campo de las redes informáticas , donde pueden tener que comunicarse ordenadores con distintos anchos de bytes.
En el uso moderno, byte casi invariablemente significa ocho bits, ya que todos los demás tamaños han caído en desuso; por eso, byte ha llegado a ser sinónimo de octeto .
El término "palabra" se utiliza para un pequeño grupo de bits que son manejados simultáneamente por procesadores de una arquitectura particular . El tamaño de una palabra es, por lo tanto, específico de la CPU. Se han utilizado muchos tamaños de palabra diferentes, incluidos 6, 8, 12, 16, 18, 24, 32, 36, 39, 40, 48, 60 y 64 bits. Dado que es arquitectónico, el tamaño de una palabra generalmente lo establece la primera CPU de una familia, en lugar de las características de una CPU compatible posterior. Los significados de los términos derivados de palabra , como palabra larga , palabra doble , palabra cuádruple y media palabra , también varían con la CPU y el sistema operativo. [7]
Prácticamente todos los nuevos procesadores de escritorio son capaces de utilizar palabras de 64 bits, aunque los procesadores integrados con tamaños de palabra de 8 y 16 bits siguen siendo comunes. La longitud de palabra de 36 bits era común en los primeros tiempos de las computadoras.
Una causa importante de la falta de portabilidad del software es la suposición incorrecta de que todos los ordenadores tienen el mismo tamaño de palabra que el ordenador utilizado por el programador. Por ejemplo, si un programador que utiliza el lenguaje C declara incorrectamente como int una variable que se utilizará para almacenar valores mayores que 2 15 −1, el programa fallará en ordenadores con números enteros de 16 bits. Esa variable debería haberse declarado como long , que tiene al menos 32 bits en cualquier ordenador. Los programadores también pueden suponer incorrectamente que un puntero se puede convertir en un número entero sin pérdida de información, lo que puede funcionar en (algunos) ordenadores de 32 bits, pero fallar en ordenadores de 64 bits con punteros de 64 bits y números enteros de 32 bits. Este problema se resuelve con C99 en stdint.h en la forma .intptr_t
El bitness de un programa puede referirse al tamaño de palabra (o bitness) del procesador en el que se ejecuta, o puede referirse al ancho de una dirección de memoria o puntero, que puede diferir entre modos de ejecución o contextos. Por ejemplo, las versiones de 64 bits de Microsoft Windows admiten binarios de 32 bits existentes, y los programas compilados para la ABI x32 de Linux se ejecutan en modo de 64 bits pero utilizan direcciones de memoria de 32 bits. [8]
El tamaño entero estándar depende de la plataforma.
En C , se denota por int y se requiere que tenga al menos 16 bits. Los sistemas Windows y Unix tienen int de 32 bits tanto en arquitecturas de 32 bits como de 64 bits.
Un entero corto puede representar un número entero que puede ocupar menos espacio de almacenamiento y tener un rango más pequeño, en comparación con un entero estándar en la misma máquina.
En C , se denota por short . Se requiere que tenga al menos 16 bits y, a menudo, es más pequeño que un entero estándar, pero esto no es obligatorio. [9] [10] Un programa conforme puede asumir que puede almacenar de forma segura valores entre −(2 15 −1) [11] y 2 15 −1, [12] pero no puede asumir que el rango no es mayor. En Java , un short es siempre un entero de 16 bits. En la API de Windows , el tipo de datos SHORT se define como un entero con signo de 16 bits en todas las máquinas. [7]
Lenguaje de programación | Nombre del tipo de datos | Firmeza | Tamaño en bytes | Valor mínimo | Valor máximo |
---|---|---|---|---|---|
C y C++ | corto | firmado | 2 | −32,767 [f] | +32,767 |
corto sin firmar | no firmado | 2 | 0 | 65.535 | |
DO# | corto | firmado | 2 | −32.768 | +32,767 |
corto | no firmado | 2 | 0 | 65.535 | |
Java | corto | firmado | 2 | −32.768 | +32,767 |
SQL | pequeñoint | firmado | 2 | −32.768 | +32,767 |
Un entero largo puede representar un número entero cuyo rango es mayor o igual al de un entero estándar en la misma máquina.
En C , se denota por long . Se requiere que tenga al menos 32 bits y puede o no ser mayor que un entero estándar. Un programa conforme puede suponer que puede almacenar de forma segura valores entre −(2 31 −1) [11] y 2 31 −1, [12] pero no puede suponer que el rango no sea mayor.
Lenguaje de programación | Tipo de aprobación | Plataformas | Nombre del tipo de datos | Almacenamiento en bytes | Rango firmado | Rango sin signo |
---|---|---|---|---|---|---|
C ISO/ANSI C99 | Norma internacional | Unix , sistemas de 16/32 bits [7] Windows , sistemas de 16/32/64 bits [7] | largo | 4 (requisito mínimo 4) | −2.147.483.647 a +2.147.483.647 | 0 a 4.294.967.295 (requisito mínimo) |
C ISO/ANSI C99 | Norma internacional | Unix , sistemas de 64 bits [7] [10] | largo | 8 (requisito mínimo 4) | −9.223.372.036.854.775.807 a +9.223.372.036.854.775.807 | 0 a 18.446.744.073.709.551.615 |
C++ ISO/ANSI | Norma internacional | Unix , Windows , sistema de 16/32 bits | largo | 4 [13] (requisito mínimo 4) | −2.147.483.648 a +2.147.483.647 | 0 a 4.294.967.295 (requisito mínimo) |
C++/CLI | Norma internacional ECMA-372 | Unix , Windows , sistemas de 16/32 bits | largo | 4 [14] (requisito mínimo 4) | −2.147.483.648 a +2.147.483.647 | 0 a 4.294.967.295 (requisito mínimo) |
Vb | Norma de la empresa | Ventanas | Largo | 4 [15] | −2.147.483.648 a +2.147.483.647 | — |
VBA | Norma de la empresa | Ventanas , Mac OS X | Largo | 4 [16] | −2.147.483.648 a +2.147.483.647 | — |
Servidor SQL | Norma de la empresa | Ventanas | Gran int | 8 | −9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 | 0 a 18.446.744.073.709.551.615 |
C# / VB.NET | Norma internacional ECMA | Microsoft .NET | largo o Int64 | 8 | −9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 | 0 a 18.446.744.073.709.551.615 |
Java | Norma internacional/empresarial | Plataforma Java | largo | 8 | −9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 | — |
Pascal | ? | Ventanas , UNIX | int64 | 8 | −9.223.372.036.854.775.808 a +9.223.372.036.854.775.807 | 0 a 18.446.744.073.709.551.615 (tipo Qword) |
En la versión C99 del lenguaje de programación C y la versión C++11 de C++ , long long
se admite un tipo que tiene el doble de la capacidad mínima del estándar long
. Este tipo no es compatible con los compiladores que requieren que el código C sea compatible con el estándar C++ anterior, C++03, porque el tipo long long no existía en C++03. Para un compilador compatible con ANSI/ISO, se deben cumplir los requisitos mínimos para los rangos especificados, es decir, −(2 63 −1) [11] a 2 63 −1 para con signo y 0 a 2 64 −1 para sin signo, [12] ; sin embargo, se permite extender este rango. [17] [18] Esto puede ser un problema al intercambiar código y datos entre plataformas, o al realizar acceso directo al hardware. Por lo tanto, hay varios conjuntos de encabezados que proporcionan tipos de ancho exacto independientes de la plataforma. La biblioteca estándar de C proporciona stdint.h ; esto se introdujo en C99 y C++11.
Los literales enteros se pueden escribir como números arábigos regulares , que consisten en una secuencia de dígitos y con la negación indicada por un signo menos antes del valor. Sin embargo, la mayoría de los lenguajes de programación no permiten el uso de comas o espacios para agrupar dígitos . Algunos ejemplos de literales enteros son:
42
10000
-233000
Existen varios métodos alternativos para escribir literales enteros en muchos lenguajes de programación:
0X
o 0x
para representar un valor hexadecimal0xDEADBEEF
, p. ej . Otros lenguajes pueden usar una notación diferente, p. ej. algunos lenguajes ensambladores añaden un H
o h
al final de un valor hexadecimal.10_000_000
en forma fija ignora los espacios incrustados en literales enteros. C (a partir de C23 ) y C++ usan comillas simples para este propósito.0755
, p. ej ., . Esto se pensó principalmente para usarse con los modos Unix ; sin embargo, ha sido criticado porque los números enteros normales también pueden comenzar con cero. [19] Por ello, Python , Ruby , Haskell y OCaml anteponen los valores octales con 0O
o 0o
, siguiendo el diseño utilizado por los valores hexadecimales.0B
o 0b
.