En informática , un entero es un dato de tipo entero , un tipo de dato que representa un rango de enteros matemáticos . [ 1 ] Los tipos de datos enteros pueden tener diferentes tamaños y pueden o no contener valores negativos. Los enteros se representan comúnmente en una computadora como un grupo de dígitos binarios (bits). El tamaño del grupo varía, por lo que el conjunto de tamaños de enteros disponibles varía entre los diferentes tipos de computadoras. El hardware de la computadora casi siempre proporciona una forma de representar un registro del procesador o una dirección de memoria como un entero.
Valor y representación
El valor de un elemento de tipo entero es el número entero matemático al que corresponde. Los tipos enteros pueden ser sin signo (capaces de representar solo enteros no negativos) o con signo (capaces de representar también enteros negativos). [ 2 ]
Un valor entero se especifica normalmente en el código fuente de un programa como una secuencia de dígitos, opcionalmente precedidos por + o −. Algunos lenguajes de programación permiten otras notaciones, como la hexadecimal (base 16) o la octal (base 8). Algunos lenguajes de programación también permiten separadores de grupos de dígitos . [ 3 ]
La representación interna de este dato es la forma en que el valor se almacena 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 un valor máximo posibles.
La representación más común de un entero positivo es una cadena de bits , utilizando el sistema numérico binario . El orden de los bytes de memoria que almacenan los bits varía; véase endianness . El ancho , precisión o bitness [ 4 ] de un tipo entero es el número de bits en su representación. Un tipo entero con n bits puede codificar 2n números ; por ejemplo, un tipo sin signo normalmente representa los valores no negativos de 0 a 2n − 1. A veces se utilizan otras codificaciones de valores enteros a patrones de bits, por ejemplo, el código decimal codificado en binario o el 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 entero con signo de n bits represente números desde −2 ( n − 1) hasta 2 ( n − 1) − 1. La aritmética de complemento a dos es conveniente porque existe una correspondencia uno a uno perfecta entre las representaciones y los 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 y sin signo. Otras posibilidades incluyen el binario desplazado , la magnitud de signo y el complemento a uno .
Algunos lenguajes de programación definen los tamaños de los enteros de forma independiente de la máquina; otros tienen definiciones variables según el tamaño de palabra del procesador subyacente. No todas las implementaciones de lenguajes definen variables de todos los tamaños de enteros, e incluso los tamaños definidos pueden no ser distintos en una implementación particular. Un entero en un lenguaje de programación puede tener un tamaño diferente en otro lenguaje, en un procesador diferente o en un contexto de ejecución con diferente número de bits; véase § Palabras .
Algunas arquitecturas informáticas antiguas utilizaban representaciones decimales de enteros, almacenados en formato BCD (decimal codificado en binario) u otros formatos. Estos valores generalmente requieren un tamaño de datos de 4 bits por dígito decimal (a veces llamado nibble ), normalmente con bits adicionales para el signo. Muchas CPU modernas ofrecen soporte limitado para enteros decimales como tipo de dato extendido, proporcionando instrucciones para convertir dichos valores a y desde valores binarios. Dependiendo de la arquitectura, los 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 ser de longitud variable (hasta un tamaño máximo de dígito), ocupando normalmente dos dígitos por byte (octeto).
Tipos de datos integrales comunes
Las distintas CPU admiten diferentes tipos de datos enteros. Normalmente, el hardware admite tipos con signo y sin signo, pero solo un conjunto pequeño y fijo de anchos.
La tabla anterior muestra los anchos de tipo entero compatibles con el hardware de los procesadores comunes. Los lenguajes de programación de alto nivel ofrecen más posibilidades. Es habitual encontrar un tipo entero de "doble ancho" que tenga el doble de bits que el tipo más grande compatible con el hardware. Muchos lenguajes también cuentan con tipos de campo de bits (un número específico de bits, generalmente limitado a ser menor que el ancho máximo compatible con el hardware) y tipos de rango (que solo pueden representar los enteros dentro de un rango específico).
Algunos lenguajes, como Lisp , Smalltalk , REXX , Haskell , Python y Raku , admiten enteros de precisión arbitraria (también conocidos como 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 usando matrices de variables más pequeñas, como java.math.BigIntegerla clase de Java o el paquete " " de Perlbigint . [ 7 ] Estos usan 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 enteros matemáticos. Estos esquemas admiten números muy grandes; por ejemplo, un kilobyte de memoria podría usarse para almacenar números de hasta 2466 dígitos decimales.
Un tipo booleano es un tipo que solo puede representar dos valores: 0 y 1, generalmente identificados con falso y verdadero , respectivamente. Este tipo se puede almacenar en memoria usando un solo bit, pero a menudo se le asigna un byte completo para facilitar el direccionamiento y acelerar el acceso.
Una cantidad de cuatro bits se conoce como nibble (al comer, por ser más pequeña que un bocado ) o nybble (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 binario.
Bytes y octetos
El término byte significaba inicialmente «la unidad de memoria direccionable más pequeña». En el pasado, se utilizaron bytes de 5, 6, 7, 8 y 9 bits. También existieron ordenadores que podían direccionar bits individuales («máquinas de direccionamiento por bits») o que solo podían direccionar cantidades de 16 o 32 bits («máquinas de direccionamiento por palabras»). El término byte no se utilizaba habitualmente en relación con las máquinas de direccionamiento por bits ni por 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 ordenadores con diferentes anchos de bytes pueden tener que comunicarse.
En el uso moderno, byte casi invariablemente significa ocho bits, ya que todos los demás tamaños han caído en desuso; por lo tanto, byte se ha convertido en sinónimo de octeto .
Palabras
El término «palabra» se utiliza para referirse a un pequeño grupo de bits que son procesados simultáneamente por procesadores de una arquitectura particular . Por lo tanto, el tamaño de una palabra depende de la CPU. Se han utilizado muchos tamaños de palabra diferentes, incluyendo 6, 8, 12, 16, 18, 24, 32, 36, 39, 40, 48, 60 y 64 bits. Dado que es un parámetro arquitectónico, el tamaño de una palabra suele estar determinado por la primera CPU de una familia, en lugar de por 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 según la CPU y el sistema operativo. [ 8 ]
Prácticamente todos los procesadores de escritorio modernos son capaces de usar palabras de 64 bits, aunque todavía son comunes los procesadores integrados con tamaños de palabra de 8 y 16 bits. La longitud de palabra de 36 bits era común en los inicios de la informática.
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 intuna variable que se utilizará para almacenar valores mayores que 2 15 −1, el programa fallará en ordenadores con 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 a un 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 enteros de 32 bits. Este problema se resuelve en C99 en stdint.h en la forma de intptr_t.
La arquitectura de un programa puede referirse al tamaño de palabra (o bits) del procesador en el que se ejecuta, o bien al ancho de una dirección de memoria o puntero, que puede variar 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. [ 9 ]
Entero estándar
El tamaño estándar de los números enteros depende de la plataforma.
En C , se denota por inty debe ser de al menos 16 bits. Los sistemas Windows y Unix tienen 32 bits inttanto en arquitecturas de 32 bits como de 64 bits.
Entero corto
Un número entero corto puede representar un número entero que puede ocupar menos espacio de almacenamiento, a la vez que tiene un rango más pequeño, en comparación con un número entero estándar en la misma máquina.
En C , se denota por short. Se requiere que sea de al menos 16 bits, y a menudo es menor que un entero estándar, pero esto no es obligatorio. [ 10 ] [ 11 ] Un programa conforme puede asumir que puede almacenar de forma segura valores entre −(2 15 − 1) [ 12 ] y 2 15 − 1 , [ 13 ] pero no puede asumir que el rango no sea mayor. En Java , un siempreshort es un entero de 16 bits. En la API de Windows , el tipo de datos se define como un entero con signo de 16 bits en todas las máquinas. [ 8 ]SHORT
Entero largo
Un entero largo puede representar un número entero cuyo rango es mayor o igual que el 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 asumir que puede almacenar de forma segura valores entre −(2 31 − 1) [ 12 ] y 2 31 − 1 , [ 13 ] pero no puede asumir que el rango no sea mayor.
Largo largo
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) [ 12 ] a 2 63 − 1 para signed y 0 a 2 64 − 1 para unsigned, [ 13 ] ; sin embargo, se permite extender este rango. [ 18 ] [ 19 ] 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.
Sintaxis
Los literales enteros se pueden escribir como números arábigos regulares , que consisten en una secuencia de dígitos y donde la negación se indica con 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 . Ejemplos de literales enteros son:
4210000-233000
En muchos lenguajes de programación existen varios métodos alternativos para escribir literales enteros:
- Muchos lenguajes de programación, especialmente aquellos influenciados por C , anteponen un literal entero con
0Xo0xpara representar un valor hexadecimal0xDEADBEEF, por ejemplo . Otros lenguajes pueden usar una notación diferente, por ejemplo, algunos lenguajes ensamblador agregan unHohal final de un valor hexadecimal. - Perl , Ruby , Java , Julia , D , Go , C# , Rust , Python (a partir de la versión 3.6) y PHP (a partir de la versión 7.4.0 [ 20 ] ) permiten guiones bajos incrustados para mayor claridad, por ejemplo , y Fortran
10_000_000de forma fija ignora los espacios incrustados en literales enteros. C (a partir de C23 ) y C++ usan comillas simples para este propósito. - En C y C++ , un cero inicial indica un valor octal
0755, por ejemplo , . Esto se concibió principalmente para usarse con modos Unix ; sin embargo, ha sido criticado porque los enteros normales también pueden comenzar con cero. [ 21 ] Por lo tanto, Python , Ruby , Haskell y OCaml anteponen a los valores octales con0Oo0o, siguiendo el formato utilizado para los valores hexadecimales. - Varios lenguajes, incluidos Java , C# , Scala , Python , Ruby , OCaml , C (a partir de C23) y C++, pueden representar valores binarios anteponiendo un número con
0Bo0b.
Valores extremos
En muchos lenguajes de programación, existen constantes predefinidas que representan los valores mínimo y máximo que se pueden representar con un tipo de entero determinado.
Los nombres para estos incluyen
- SmallBASIC :
MAXINT[ 22 ] - Java : , [ 23 ]
java.lang.Integer.MAX_VALUEjava.lang.Integer.MIN_VALUE- Existen campos correspondientes para las demás clases de enteros en Java.
- C :
INT_MAX,INT_MIN, etc. [ 24 ] - C++ : , , etc. [ 26 ]
std::numeric_limits<int>::max()std::numeric_limits<int>::min() - Haskell :
minBound,maxBound[ 27 ] - Pascal :
MaxInt - Python 2 : [ 28 ]
sys.maxint - Python 3 : [ 29 ]
sys.maxsize - Óxido : , , etc. [ 30 ]
i32::MAXi32::MIN - Turing :
maxint[ 31 ]
Véase también
Notas
- ↑ No todos los dialectos SQL tienen tipos de datos sin signo. [ 5 ] [ 6 ]
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Los tamaños de char , short , int , long y long long en C/C++ dependen de la implementación del lenguaje.
- 1 2 3 4 Fortran utiliza 'kinds' para controlar el tamaño de los enteros. Las constantes parametrizadas que definen los tipos disponibles se encuentran en el módulo intrínseco iso_fortran_env. Las constantes que definen tipos compatibles con C se encuentran en el módulo intrínseco iso_c_binding.
- ↑ Java no admite directamente operaciones aritméticas en tipos char . Los resultados deben convertirse de nuevo a char desde un int .
- 1 2 Los tamaños de Integer y Cardinal de Delphino están garantizados, varían de una plataforma a otra; generalmente se definen como LongInt y LongWord respectivamente.
- 1 2 Reservado para uso futuro. Aún no implementado.
- ↑ El estándar ISO C permite que las implementaciones reserven el valor con el bit de signo 1 y todos los demás bits 0 (para la representación de signo-magnitud y complemento a dos) o con todos los bits 1 (para el complemento a uno) para usarlo como un valor de "trampa", utilizado para indicar (por ejemplo) un desbordamiento. [ 12 ]
Referencias
- ↑ "Entero". Diccionario de Ciencias de la Computación . Oxford University Press. 21 de enero de 2016. ISBN 978-0-19-968897-5.
- ↑ Cheever, Eric. "Representación de números" . Swarthmore College . Consultado el 11 de septiembre de 2011 .
- ↑ Madhusudhan Konda (2 de septiembre de 2011). "Un vistazo a las nuevas características de Java 7 - O'Reilly Radar" . Radar.oreilly.com . Consultado el 15 de octubre de 2013 .
- ↑ Barr, Adam (23 de octubre de 2018). El problema del software: por qué los ingenieros inteligentes escriben mal código . MIT Press. ISBN 978-0-262-34821-8.
- ↑ "Sybase Adaptive Server Enterprise 15.5: Tipos de datos numéricos exactos" .
- ↑ "Tipos de datos numéricos de MySQL 5.6" .
- ↑ "BigInteger (Java Platform SE 6)" . Oracle . Consultado el 11 de septiembre de 2011 .
- 1 2 3 4 5 Fog, Agner (2010-02-16). "Convenciones de llamada para diferentes compiladores y sistemas operativos de C++: Capítulo 3, Representación de datos" (PDF) . Recuperado el 30 de agosto de 2010 .
- ↑ Thorsten Leemhuis (13 de septiembre de 2011). "Registro del kernel: la ABI x32 supera las desventajas de 64 bits" . www.h-online.com. Archivado del original el 28 de octubre de 2011. Consultado el 1 de noviembre de 2011 .
- ↑ Giguere, Eric (18 de diciembre de 1987). "El estándar ANSI: un resumen para el programador de C" . Recuperado el 4 de septiembre de 2010 .
- 1 2 Meyers, Randy (2000-12-01). "The New C: Integers in C99, Part 1" . drdobbs.com . Recuperado el 2010-09-04 .
- 1 2 3 4 "ISO/IEC 9899:201x" (PDF) . open-std.org. Sección 6.2.6.2, párrafo 2. Consultado el 20 de junio de 2016 .
- 1 2 3 "ISO/IEC 9899:201x" (PDF) . open-std.org. sección 5.2.4.2.1 . Recuperado el 2016-06-20 .
- ↑ "Tipos fundamentales en C++" . cppreference.com. Archivado del original el 13 de junio de 2011. Consultado el 5 de diciembre de 2010 .
- ↑ "Capítulo 8.6.2 en la página 12" (PDF) . ecma-international.org.
- ↑ Archivo de ayuda de VB 6.0
- ↑ "Los tipos de datos entero, largo y byte (VBA)" . microsoft.com . Consultado el 19 de diciembre de 2006 .
- ↑ Giguere, Eric (18 de diciembre de 1987). "El estándar ANSI: un resumen para el programador de C" . Recuperado el 4 de septiembre de 2010 .
- ↑ "El lenguaje de programación estándar nacional estadounidense C especifica la sintaxis y la semántica de los programas escritos en el lenguaje de programación C" . Archivado del original el 22 de agosto de 2010. Consultado el 4 de septiembre de 2010 .
- ↑ "PHP: Números enteros - Manual" .
- ↑ Borrador de la 6.ª edición de ECMAScript: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals Archivado el 16/12/2013 en Wayback Machine
- ↑ "SmallBASIC | MAXINT" . Consultado el 20 de enero de 2025 .
- ↑ "Integer (Java Platform SE 8)" . Consultado el 20 de enero de 2025 .
- ↑ "Límites numéricos" . cppreference.com.
- ↑ "Límites de los tipos básicos" . Consultado el 20 de enero de 2025 .
- ↑ "std::numeric_limits" . cppreference.com.
- ↑ "Preludio" .
- ↑ "28.1. sys — Parámetros y funciones específicos del sistema — Documentación de Python 2.7.18" . docs.python.org . Consultado el 17 de septiembre de 2025 .
- ↑ "sys — Parámetros y funciones específicos del sistema" . Documentación de Python 3.13.7 . Consultado el 17 de septiembre de 2025 .
- ↑ "Tipo primitivo i32" . doc.rust-lang.org/std.
- ↑ Grogono, Peter (1995). Programación con Turing y Turing orientado a objetos . Nueva York: Springer. pág. 363. doi : 10.1007/978-1-4612-4238-3 . ISBN 978-0-387-94517-0. LCCN 95010802 .
- Tipos de datos
- aritmética informática
- Tipos primitivos