Número entero (informática)

Dato de tipo de datos integral

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.

Valor y representación

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).

Tipos de datos integrales comunes

PedazosNombreRango (asumiendo complemento a dos para )Dígitos decimalesUsosImplementaciones
C / C++DO#Pascal y DelfosJavaSQL [a]FORTRANDÓxido
4mordisco , semioctetoFirmado: De −8 a 7, de −(2 3 ) a 2 3  − 10.9Decimal codificado en binario , representación de un solo dígito decimal
Sin signo: De 0 a 15, que es igual a 2 4  − 11.2
8byte , octeto , i8, u8Firmado: De −128 a 127, de −(2 7 ) a 2 7  − 12.11Caracteres ASCII , unidades de código en la codificación de caracteres UTF-8 int8_t , carácter con signo [b]sbyteAbreviaturabytediminutoentero(int8)bytei8
Sin signo: de 0 a 255, lo que equivale a 2 · 8  − 12.41uint8_t , carácter sin signo [b]byteBytetinyint sin firmarubyteu8
16media palabra, palabra , corto, i16, u16Firmado: De −32.768 a 32.767, de −(2 15 ) a 2 15  − 14.52Caracteres UCS-2 , unidades de código en la codificación de caracteres UTF-16 int16_t , corto [b] , int [b]cortoPequeñointcortopequeñointentero(int16)cortoi16
Sin signo: de 0 a 65.535, que es igual a 2 · 16  − 14.82uint16_t, sin signo [b] , int sin signo [b]cortoPalabracarácter [c]smallint sin signocortou16
32palabra, larga , palabra doble, palabra larga, int, i32, u32Firmado: De −2.147.483.648 a 2.147.483.647 , de −(2 31 ) a 2 31  − 19.33Caracteres UTF-32 , color verdadero con alfa, FourCC , punteros en computación de 32 bitsint32_t , int [b] , largo [b]enteroLongInt ; Entero [d]enteroenteroentero(int32)enteroi32
Sin signo: De 0 a 4.294.967.295, que es igual a 2 · 32  − 19.63uint32_t, sin signo [b] , int sin signo [b] , largo sin signo [b]unidadPalabra larga ; Palabra doble ; Cardinal [d]entero sin signounidadu32
64palabra, palabra doble, palabra larga, larga, larga larga, cuádruple, palabra cuádruple, qword, int64, i64, u64Firmado: De −(2 63 ) a 2 63  − 118,96Tiempo (milisegundos desde la época Unix ), punteros en computación de 64 bitsint64_t , largo [b] , largo largo [b]largoInt64largograndeentero(int64)largoi64
Sin signo: De 0 a 2 64  − 119.27uint64_t , sin signo largo largo [b]largoUInt64 ; PalabraQbigint sin firmarlargou64
128octapalabra, doble cuadruplepalabra, i128, u128Firmado: De −(2 127 ) a 2 127  − 138.23Cálculos científicos complejos,

Direcciones IPv6 , GUID

C: solo disponible como extensión específica del compilador no estándarcentavo [e]i128
Sin signo: De 0 a 2 128  − 138,53ucente [e]u128
norteentero de n
bits (caso general)
Firmado: −(2 n −1 ) a (2 n −1  − 1)( n  − 1) logaritmo 10  2C23: _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  2C23: _BitInt(n) sin signoAda: 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.

Bytes y octetos

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 .

Palabras

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]

Número entero estándar

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.

Entero corto

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]

Tamaños de números enteros cortos comunes
Lenguaje de programaciónNombre del tipo de datosFirmezaTamaño en bytesValor mínimoValor máximo
C y C++cortofirmado2−32,767 [f]+32,767
corto sin firmarno firmado2065.535
DO#cortofirmado2−32.768+32,767
cortono firmado2065.535
Javacortofirmado2−32.768+32,767
SQLpequeñointfirmado2−32.768+32,767

Entero largo

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.

Tamaños de números enteros largos comunes
Lenguaje de programaciónTipo de aprobaciónPlataformasNombre del tipo de datosAlmacenamiento en bytesRango firmadoRango sin signo
C ISO/ANSI C99Norma internacionalUnix , sistemas de 16/32 bits [7]
Windows , sistemas de 16/32/64 bits [7]
largo4
(requisito mínimo 4)
−2.147.483.647 a +2.147.483.6470 a 4.294.967.295
(requisito mínimo)
C ISO/ANSI C99Norma internacionalUnix ,
sistemas de 64 bits [7] [10]
largo8
(requisito mínimo 4)
−9.223.372.036.854.775.807 a +9.223.372.036.854.775.8070 a 18.446.744.073.709.551.615
C++ ISO/ANSINorma internacionalUnix , Windows ,
sistema de 16/32 bits
largo4 [13]
(requisito mínimo 4)
−2.147.483.648 a +2.147.483.647
0 a 4.294.967.295
(requisito mínimo)
C++/CLINorma internacional
ECMA-372
Unix , Windows ,
sistemas de 16/32 bits
largo4 [14]
(requisito mínimo 4)
−2.147.483.648 a +2.147.483.647
0 a 4.294.967.295
(requisito mínimo)
VbNorma de la empresaVentanasLargo4 [15]−2.147.483.648 a +2.147.483.647
VBANorma de la empresaVentanas , Mac OS XLargo4 [16]−2.147.483.648 a +2.147.483.647
Servidor SQLNorma de la empresaVentanasGran int8−9.223.372.036.854.775.808 a +9.223.372.036.854.775.8070 a 18.446.744.073.709.551.615
C# / VB.NETNorma internacional ECMAMicrosoft .NETlargo o Int648−9.223.372.036.854.775.808 a +9.223.372.036.854.775.8070 a 18.446.744.073.709.551.615
JavaNorma internacional/empresarialPlataforma Javalargo8−9.223.372.036.854.775.808 a +9.223.372.036.854.775.807
Pascal?Ventanas , UNIXint648−9.223.372.036.854.775.808 a +9.223.372.036.854.775.8070 a 18.446.744.073.709.551.615 (tipo Qword)

Largo largo

En la versión C99 del lenguaje de programación C y la versión C++11 de C++ , long longse 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.

Sintaxis

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:

  • Muchos lenguajes de programación, especialmente aquellos influenciados por C , anteponen un literal entero con 0Xo 0xpara representar un valor hexadecimal0xDEADBEEF , p. ej . Otros lenguajes pueden usar una notación diferente, p. ej. algunos lenguajes ensambladores añaden un Ho hal final de un valor hexadecimal.
  • Perl , Ruby , Java , Julia , D , Go , Rust y Python (a partir de la versión 3.6) permiten guiones bajos incrustados para mayor claridad, por ejemplo , y Fortran10_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.
  • En C y C++ , un cero inicial indica un valor octal0755 , 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 0Oo 0o, siguiendo el diseño utilizado por 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 0Bo 0b.

Véase también

Notas

  1. ^ No todos los dialectos SQL tienen tipos de datos sin signo. [4] [5]
  2. ^ abcdefghijklmn Los tamaños de char , short , int , long y long long en C/C++ dependen de la implementación del lenguaje.
  3. ^ Java no admite directamente operaciones aritméticas con tipos char . Los resultados deben convertirse de nuevo a char desde un int .
  4. ^ ab Los tamaños de Integer y Cardinal de Delphi no están garantizados y varían de una plataforma a otra; normalmente se definen como LongInt y LongWord respectivamente.
  5. ^ ab Reservado para uso futuro. No implementado aún.
  6. ^ 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 complemento a uno) para su uso como un valor de "trampa", utilizado para indicar (por ejemplo) un desbordamiento. [11]

Referencias

  1. ^ Cheever, Eric. "Representación de números". Swarthmore College . Consultado el 11 de septiembre de 2011 .
  2. ^ 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 .
  3. ^ Barr, Adam (23 de octubre de 2018). El problema del software: por qué los ingenieros inteligentes escriben código incorrecto. MIT Press. ISBN 978-0-262-34821-8.
  4. ^ "Sybase Adaptive Server Enterprise 15.5: Tipos de datos numéricos exactos".
  5. ^ "Tipos de datos numéricos de MySQL 5.6".
  6. ^ "BigInteger (Java Platform SE 6)". Oracle . Consultado el 11 de septiembre de 2011 .
  7. ^ abcde Fog, Agner (16 de febrero de 2010). "Convenciones de llamada para diferentes compiladores y sistemas operativos de C++: Capítulo 3, Representación de datos" (PDF) . Consultado el 30 de agosto de 2010 .
  8. ^ Thorsten Leemhuis (13 de septiembre de 2011). "Registro del núcleo: la ABI x32 soluciona los inconvenientes de los 64 bits". www.h-online.com. Archivado desde el original el 28 de octubre de 2011. Consultado el 1 de noviembre de 2011 .
  9. ^ Giguere, Eric (18 de diciembre de 1987). "El estándar ANSI: un resumen para el programador de C" . Consultado el 4 de septiembre de 2010 .
  10. ^ ab Meyers, Randy (1 de diciembre de 2000). "El nuevo C: números enteros en C99, parte 1". drdobbs.com . Consultado el 4 de septiembre de 2010 .
  11. ^ abcd "ISO/IEC 9899:201x" (PDF) . open-std.org. sección 6.2.6.2, párrafo 2 . Consultado el 20 de junio de 2016 .
  12. ^ abc "ISO/IEC 9899:201x" (PDF) . open-std.org. sección 5.2.4.2.1 . Consultado el 20 de junio de 2016 .
  13. ^ "Tipos fundamentales en C++". cppreference.com . Consultado el 5 de diciembre de 2010 .
  14. ^ "Capítulo 8.6.2 en la página 12" (PDF) . ecma-international.org.
  15. ^ Archivo de ayuda de VB 6.0
  16. ^ "Los tipos de datos enteros, largos y bytes (VBA)". microsoft.com . Consultado el 19 de diciembre de 2006 .
  17. ^ Giguere, Eric (18 de diciembre de 1987). "El estándar ANSI: un resumen para el programador de C" . Consultado el 4 de septiembre de 2010 .
  18. ^ "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 desde el original el 22 de agosto de 2010. Consultado el 4 de septiembre de 2010 .
  19. ^ Borrador de la sexta edición de ECMAScript: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-numeric-literals Archivado el 16 de diciembre de 2013 en Wayback Machine.
Obtenido de "https://es.wikipedia.org/w/index.php?title=Número_entero_(informática)&oldid=1258172078#Número_entero_largo"