Entero (informática)
En informática, un entero es un dato de tipo de datos integral, un tipo de datos que representa algún rango de números enteros matemáticos. Los tipos de datos integrales pueden ser de diferentes tamaños y pueden o no permitirse que contengan 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 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 de tipo integral es el entero matemático al que corresponde. Los tipos integrales pueden ser sin signo (capaces de representar solo enteros no negativos) o firmados (capaces de representar enteros negativos también).
Un valor entero generalmente se especifica en el código fuente de un programa como una secuencia de dígitos con el prefijo opcional + 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.
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 posible.
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; ver endianidad. El ancho o precisión de un tipo integral es el número de bits en su representación. Un tipo integral con n bits puede codificar 2n números; por ejemplo, un tipo sin signo normalmente representa los valores no negativos del 0 al 2n−1. A veces se utilizan otras codificaciones de valores enteros en patrones de bits, por ejemplo, código Gray o decimal codificado en binario, o como códigos de caracteres impresos, como ASCII.
Hay cuatro formas conocidas de representar números con signo en un sistema informático binario. El más común es el complemento a dos, que permite un tipo integral con signo con n bits para representar números desde −2(n−1) a 2(n−1)−1. La aritmética en complemento a dos es conveniente porque existe una correspondencia biunívoca perfecta entre las representaciones y los valores (en particular, no se separan +0 y −0), y porque la suma, la resta y la multiplicación no necesitan distinguir entre tipos firmados y no firmados. Otras posibilidades incluyen compensación binaria, signo-magnitud y unidades. complementar.
Algunos lenguajes informáticos definen tamaños 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 lenguaje definen variables de todos los tamaños enteros, y es posible que los tamaños definidos ni siquiera sean 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 o en un procesador diferente.
Tipos de datos integrales comunes
Bits | Nombre | Rango (asumiendo el complemento de dos para firmado) | dígitos decimales | Usos | Aplicación | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
C/C++ | C# | Pascal y Delphi | Java | SQL | FORTRAN | D | Rust | |||||
4 | nibble, semioctet | Firmada: De −8 a 7, de −23) a 23− 1 | 0.9 | Decimal codificado binario, representación de dígitos decimales | — | — | — | — | — | — | — | — |
Insigned: De 0 a 15, que equivale a 24− 1 | 1.2 | |||||||||||
8 | byte, octet, i8, u8 | Firmada: De −128 a 127, de −27) a 27− 1 | 2.11 | ASCII caracteres, unidades de código en la codificación de caracteres UTF-8 | int8_t, firmado por | sbyte | Shortint | byte | diminuto | entero (1) | byte | i8 |
Insigned: De 0 a 255, que equivale a 28− 1 | 2.41 | uint8_t, unsigned char | byte | Byte | — | diminuto no firmado | — | ubyte | u8 | |||
16 | media palabra, palabra, corto, i16, u16 | Firmada: From −32,768 to 32,767, from −(215) a 215− 1 | 4.52 | caracteres UCS-2, unidades de código en la codificación de caracteres UTF-16 | int16_t, corto, int | corto | Pequeño | corto | pequeña | integer(2) | corto | i16 |
Insigned: De 0 a 65,535, que equivale a 216− 1 | 4.82 | uint16_t, unsigned, int | ushort | Palabra | char | unsigned smallint | — | ushort | u16 | |||
32 | palabra, larga, palabra doble, palabra larga, int, i32, u32 | Firmada: De −2147,483,648 a 2147,483,647, de −231) a 231− 1 | 9.33 | caracteres UTF-32, verdadero color con alpha, FourCC, punteros en computación de 32 bits | int32_t, int, largo | int | LongInt; Integer | int | int | integer(4) | int | i32 |
Insigned: De 0 a 4.294.967.295, que equivale a 232− 1 | 9.63 | Uint32_t, unsigned, int, no firmado largo | Uint | LongWord; DWord; Cardenal | — | int | — | Uint | u32 | |||
64 | palabra, palabra doble, palabra larga, larga, quad, quadword, qword, int64, i64, u64 | Firmada: From −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807, from −(263) a 263− 1 | 18.96 | Tiempo (milliseconds desde la época Unix), punteros en computación de 64 bits | int64_t, largo, largo | largo | Int64 | largo | bigint | integer(8) | largo | i64 |
Insigned: De 0 a 18,446,744,073,709,551,615, que equivale a 264− 1 | 19.27 | uint64_t, sin firmar mucho tiempo | ulong | UInt64; QWord | — | unsigned bigint | — | ulong | u64 | |||
128 | octaword, doble cuaderno, i128, u128 | Firmada: From −170,141,183,460,469,231,731,687,303,715,884,105,728 to 170,141,183,460,469,231,731,687,303,715,884,105,727, from −(2127) a 2127− 1 | 38.23 | Cálculos científicos complejos,
Dirección IPv6, GUIDs | C: sólo disponible como extensión no estándar del compilador | — | — | — | — | integer(16) | Porcentaje | i128 |
Insigned: De 0 a 340.282.336.920,938,463,374,607,431,768,211,455, que equivale a 2128− 1 | 38.53 | — | ucent | u128 | ||||||||
n | n-bit integer (caso general) | Firmada: −2n−1) a (2n−1−1) | ()n− 1) log102 | Ada: rango -2**(n-1)..2**(n-1)-1 | ||||||||
Insigned: 0 a 2n −1) | n log102 | Ada: rango 0,2**n-1, mod. 2**n; bibliotecas estándar o bibliotecas aritméticas arbitrarias de terceros Clases BigDecimal o Decimal en muchos idiomas como Python, C++, etc. |
Distintas CPU admiten diferentes tipos de datos integrales. Por lo general, el hardware admitirá tipos firmados y no firmados, pero solo un conjunto pequeño y fijo de anchos.
La tabla anterior enumera los anchos de tipo integral que son compatibles con el hardware de los procesadores comunes. Los lenguajes de programación de alto nivel brindan más posibilidades. Es común tener un 'doble ancho' tipo integral que tiene el doble de bits que el tipo más grande compatible con hardware. Muchos lenguajes también tienen tipos de campo de bits (un número específico de bits, generalmente restringido a ser menor que el ancho máximo admitido por hardware) y tipos de rango (que pueden representar solo los enteros en un rango especificado).
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 números grandes). 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 Perl's "bigint" paquete. Estos usan tanta memoria de la computadora como sea necesario para almacenar los números; sin embargo, una computadora tiene solo una cantidad finita de almacenamiento, por lo que también pueden representar solo un subconjunto finito de los números enteros matemáticos. Estos esquemas admiten números muy grandes; por ejemplo, se podría usar un kilobyte de memoria para almacenar números de hasta 2466 dígitos decimales.
Un tipo booleano o indicador 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 usando 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 (cuando se come, siendo más pequeña que un mordisco) o nybble (siendo un juego de palabras en 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áquina con direccionamiento de bits'), o que solo podían direccionar cantidades de 16 o 32 bits ('máquina con direccionamiento de palabra'). El término byte generalmente no se usaba en absoluto en conexión con máquinas con direcciones de 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 de computadoras, donde las computadoras con diferentes anchos de byte pueden tener que comunicarse.
En el uso moderno, byte significa casi invariablemente 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 octet.
Palabras
El término 'palabra' se usa 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 posterior compatible. 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.
Prácticamente todos los nuevos procesadores de escritorio son capaces de utilizar palabras de 64 bits, aunque los procesadores integrados con tamaño de palabra de 8 y 16 bits siguen siendo comunes. La longitud de palabra de 36 bits era común en los primeros días de las computadoras.
Una causa importante de la no portabilidad del software es la suposición incorrecta de que todas las computadoras tienen el mismo tamaño de palabra que la computadora utilizada 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 215−1, el El programa fallará en computadoras con números enteros de 16 bits. Esa variable debería haberse declarado como long, que tiene al menos 32 bits en cualquier computadora. 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 (algunas) computadoras de 32 bits, pero fallar en computadoras de 64 bits con punteros de 64 bits y enteros de 32 bits. Este problema lo resuelve C99 en stdint.h en forma de intptr_t .
Entero corto
Un entero corto puede representar un número entero que puede requerir menos almacenamiento, mientras 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 corto. Se requiere que tenga al menos 16 bits y, a menudo, es más pequeño que un número entero estándar, pero esto no es obligatorio. Un programa conforme puede suponer que puede almacenar con seguridad valores entre −(215−1) y 215−1, pero no puede suponer que el rango no es mayor. En Java, un short es siempre un número entero de 16 bits. En la API de Windows, el tipo de datos SHORT se define como un entero de 16 bits con signo en todas las máquinas.
Lenguaje de programación | Nombre del tipo de datos | Signedness | Tamaño en bytes | Valor mínimo | Valor máximo |
---|---|---|---|---|---|
C y C++ | corto | firmado | 2 | −32.767 | +32,767 |
corto no firmado | no firmado | 2 | 0 | 65.535 | |
C# | corto | firmado | 2 | −32.768 | +32,767 |
ushort | no firmado | 2 | 0 | 65.535 | |
Java | corto | firmado | 2 | −32.768 | +32,767 |
Entero largo
Un entero largo puede representar un entero 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 más grande que un número entero estándar. Un programa conforme puede suponer que puede almacenar con seguridad valores entre −(231−1) y 231−1, pero no puede suponer que el rango no es mayor.
Lenguaje de programación | Tipo de aprobación | Plataformas | Nombre del tipo de datos | Almacenamiento en bytes | Rango señalizado | Rango no asignado |
---|---|---|---|---|---|---|
C ISO/ANSI C99 | International Standard | Sistemas Unix,16/32-bit Sistemas Windows,16/32/64-bit | largo | 4 (requisito mínimo) | −2,147,483,647 a +2,147,483,647 | 0 a 4.294.967.295 (requisito mínimo) |
C ISO/ANSI C99 | International Standard | Unix, Sistemas de 64 bits | largo | 8 (requisito mínimo) | −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 | International Standard | Unix, Windows, Sistema 16/32-bit | largo | 4 (requisito mínimo) | −2,147,483,648 a +2,147,483,647 | 0 a 4.294.967.295 (requisito mínimo) |
C++/CLI | International Standard ECMA-372 | Unix, Windows, Sistemas 16/32-bit | largo | 4 (requisito mínimo) | −2,147,483,648 a +2,147,483,647 | 0 a 4.294.967.295 (requisito mínimo) |
VB | Company Standard | Windows | Largo | 4 | −2,147,483,648 a +2,147,483,647 | — |
VBA | Company Standard | Windows, Mac OS X | Largo | 4 | −2,147,483,648 a +2,147,483,647 | — |
SQL Server | Company Standard | Windows | BigInt | 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 | ECMA International Standard | 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 | International/Company Standard | Java plataforma | largo | 8 | −9,223,372,036,854,775,808 a +9,223,372,036,854,775,807 | — |
Pascal | ? | Windows, 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 de palabra) |
Largo largo
En la versión C99 del lenguaje de programación C y la versión C++11 de C++, se admite un tipo long long
que tiene el doble de capacidad mínima que el estándar long. Este tipo no es compatible con los compiladores que requieren que el código C cumpla 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, los requisitos mínimos para los rangos especificados, es decir, −(263−1) a 263−1 para firmado y 0 a 264−1 para no firmado, debe cumplirse; sin embargo, se permite extender este rango. Esto puede ser un problema al intercambiar código y datos entre plataformas, o al acceder directamente 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 para números 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 la agrupación de dígitos. Ejemplos de literales enteros son:
42
10000
-233000
Existen varios métodos alternativos para escribir literales enteros en muchos lenguajes de programación:
- La mayoría de los lenguajes de programación, especialmente los influenciados por C, prefijo un literal entero con
0X
o0x
para representar un valor hexadecimal, por ejemplo.0xDEADBEEF
. Otros idiomas pueden utilizar una notación diferente, por ejemplo, algunos idiomas de montaje adjuntan unH
oh
al final de un valor hexadecimal. - Perl, Ruby, Java, Julia, D, Go, Rust y Python (a partir de la versión 3.6) permiten los subrayados embebidos para la claridad, por ejemplo.
10_000_000
, y forma fija Fortran ignora los espacios incrustados en literales enteros. C (a partir de C23) y C++ usan citas individuales para este propósito. - En C y C++, un cero líder indica un valor octal, por ejemplo.
0755
. Esto estaba destinado principalmente a ser utilizado con modos Unix; sin embargo, se ha criticado porque los enteros normales también pueden conducir con cero. Como tal, Python, Ruby, Haskell y OCaml prefijo valores octal con0O
o0o
, siguiendo el diseño utilizado por los valores hexadecimales. - Varios idiomas, incluyendo Java, C#, Scala, Python, Ruby, OCaml, C (a partir de C23) y C++ pueden representar valores binarios prefijiendo un número con
0B
o0b
.
Contenido relacionado
Lógica transistor-transistor
Física computacional
Capa de abstracción