Entero (ciencias de la computación) - Integer (computer science)

En informática, un número 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 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 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 número entero matemático al que corresponde. Los tipos integrales pueden estar sin signo (capaces de representar solo enteros no negativos) o con signo (capaces de representar también enteros negativos).

Un valor entero se especifica típicamente en el código fuente de un programa como una secuencia de dígitos opcionalmente prefijados con + 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 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 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 la precisión 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 .

Hay cuatro formas bien 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 que un tipo integral con signo con n bits represente números de −2 ( n −1) a 2 ( n −1) −1. La aritmética en complemento a dos es conveniente porque existe una perfecta correspondencia uno a uno entre representaciones y valores (en particular, sin +0 y −0 separados), y porque la suma , resta y multiplicación no necesitan distinguir entre tipos con signo y sin signo. . Otras posibilidades incluyen offset binario , signo de magnitud y complemento de unos .

Algunos lenguajes de computadora definen tamaños enteros de una manera independiente de la máquina; otros tienen distintas definiciones según el tamaño de la palabra del procesador subyacente. No todas las implementaciones de lenguaje definen variables de todos los tamaños de números 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 a dos para con signo ) Dígitos decimales Usos Implementaciones
C / C ++ C# Pascal y Delphi Java SQL FORTRAN D
4
mordisquear , semiocteto Firmado: De −8 a 7, de - (2 3 ) a 2 3  - 1
0,9
Representación decimal codificada en binario , de un solo dígito decimal n / A n / A n / A n / A n / A n / A n / A
Sin firmar: de 0 a 15, que equivale 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 firmado sbyte Shortint byte diminuto entero (1) byte
Sin firmar: de 0 a 255, lo que equivale a 2 8  - 1
2,41
uint8_t , carácter sin firmar byte Byte n / A tinyint sin firmar n / A ubyte
dieciséis
media palabra , palabra , corta, i16, u16 Firmado: De 32.768 a 32.767, de - (2 de 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 , int pequeño Smallint pequeño pequeño entero (2) pequeño
Sin firmar: de 0 a 65.535, lo que equivale a 2 16  - 1
4.82
uint16_t, unsigned , unsigned int corto Palabra carbonizarse smallint sin firmar n / A corto
32
palabra, larga , palabra doble, palabra larga, int, i32, u32 Firmado: A partir de -2147483648 a 2147483647 , entre - (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 , largo En t LongInt ; Entero En t En t entero (4) En t
Sin firmar: de 0 a 4.294.967.295, lo que equivale a 2 32  - 1
9,63
uint32_t, unsigned , unsigned int , unsigned long uint LongWord ; DWord ; Cardenal n / A int sin firmar n / A uint
64
palabra, palabra doble, palabra larga, larga larga, cuádruple, cuádruple palabra, qword, int64, i64, u64 Firmado: De −9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 , de - (2 63 ) a 2 63  - 1
18,96
Tiempo (milisegundos desde la época de Unix ), punteros en computación de 64 bits int64_t , largo , largo , largo largo Int64 largo Empezando entero (8) largo
Sin firmar: de 0 a 18,446,744,073,709,551,615, lo que equivale a 2 64  - 1
19.27
uint64_t , unsigned long long ulong UInt64 ; QWord n / A bigint sin firmar n / A ulong
128
octapalabra, palabra cuádruple doble, i128, u128 Firmado: De -170.141.183.460.469.231.731.687.303.715.884.105.728 a 170.141.183.460.469.231.731.687.303.715.884.105.727, entre - (2 127 ) a 2 127  - 1
38.23
Cálculos científicos complejos,

Direcciones IPv6 , GUID

C: solo disponible como extensión específica del compilador no estándar n / A n / A n / A n / A entero (16) centavo
Sin firmar: De 0 a 340.282.366.920.938.463.463.374.607.431.768.211.455, lo que equivale a 2 128  - 1
38,53
n / A ucent
norte
entero de n bits
(caso general)
Firmado: - (2 n −1 ) a (2 n −1-1  ) ( n  - 1) log 10  2 Ada : rango -2 ** (n-1) .. 2 ** (n-1) -1
Sin firmar: 0 a (2 n - 1) n log 10  2 Ada: rango 0..2 ** n-1 , mod 2 ** n ; Las clases BigDecimal o Decimal de bibliotecas estándar o bibliotecas aritméticas arbitrarias de terceros en muchos lenguajes como Python, C ++, etc.

Diferentes CPU admiten diferentes tipos de datos integrales. Por lo general, el hardware admite tipos firmados y no firmados, pero solo un pequeño conjunto fijo de anchos.

La tabla anterior enumera los anchos de tipo integral que son admitidos en hardware por procesadores comunes. Los lenguajes de programación de alto nivel ofrecen más posibilidades. Es común tener un tipo integral de 'doble ancho' 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 números enteros en un rango específico).

Algunos lenguajes, como Lisp , Smalltalk , REXX , Haskell , Python y Raku admiten enteros de precisión arbitrarios (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 utilizando matrices de variables más pequeñas, como la clase BigInteger de Java o el paquete " bigint " de Perl . 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 pueden representar un subconjunto finito de 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 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áquina con dirección de bit'), o que solo podían direccionar cantidades de 16 o 32 bits ('máquina con dirección de palabra'). El término byte generalmente no se usaba en absoluto en relació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 bytes 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 tanto, byte se ha convertido en sinónimo de octeto .

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 . Por tanto, el tamaño de una palabra es específico de la CPU. Se han utilizado muchos tamaños de palabras 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 según la CPU y el sistema operativo.

Prácticamente todos los procesadores de escritorio nuevos son capaces de usar palabras de 64 bits, aunque los procesadores integrados con tamaños de palabras de 8 y 16 bits siguen siendo comunes. La longitud de la 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 usa el lenguaje C declara incorrectamente como int una variable que se usará para almacenar valores mayores que 2 15 −1, el programa fallará en computadoras con enteros de 16 bits. Esa variable debería haber sido declarada tan larga , que tiene al menos 32 bits en cualquier computadora. Los programadores también pueden asumir incorrectamente que un puntero se puede convertir a 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 ocupar menos espacio de almacenamiento, mientras que tiene un rango más pequeño, en comparación con un entero estándar en la misma máquina.

En C , se denota por abreviatura . Se requiere que tenga al menos 16 bits y, a menudo, es más pequeño que un número entero estándar, pero no es necesario. Un programa conforme puede asumir que puede almacenar de forma segura valores entre - (2 15 −1) y 2 15 −1, 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.

Tamaños de enteros cortos comunes
Lenguaje de programación Nombre del tipo de datos Firma Tamaño en bytes Valor mínimo Valor máximo
C y C ++ pequeño firmado 2 −32,767 +32,767
corto sin firmar no firmado 2 0 65.535
C# pequeño firmado 2 −32,768 +32,767
corto no firmado 2 0 65.535
Java pequeño firmado 2 −32,768 +32,767

Entero largo

Un entero largo puede representar un 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 ser mayor o no mayor que un número entero estándar. Un programa conforme puede asumir que puede almacenar de forma segura valores entre - (2 31 −1) y 2 31 −1, pero no puede asumir que el rango no es mayor.

Tamaños de enteros largos comunes
Lenguaje de programación Tipo de aprobación Plataformas Nombre del tipo de datos Almacenamiento en bytes Rango firmado Rango sin firmar
C ISO / ANSI C99 Estándar internacional Unix , sistemas de 16/32 bits
Windows , sistemas de
16/32/64 bits
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 Estándar internacional Unix , sistemas de
64 bits
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 Estándar internacional Unix , de Windows ,
el sistema 16/32-bit
largo 4
(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 , de Windows ,
sistemas de 16/32-bit
largo 4
(requisito mínimo 4)
−2,147,483,648 a +2,147,483,647
0 a 4.294.967.295
(requisito mínimo)
VB Estándar de la empresa Ventanas Largo 4 −2,147,483,648 a +2,147,483,647 N / A
VBA Estándar de la empresa Windows , Mac OS X Largo 4 −2,147,483,648 a +2,147,483,647 N / A
servidor SQL Estándar de la empresa Ventanas Empezando 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 Estándar internacional / de la empresa Plataforma Java largo 8 −9,223,372,036,854,775,808 a +9,223,372,036,854,775,807 N / A
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 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 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) a 2 63 −1 para con signo y 0 a 2 64 −1 para sin signo; sin embargo, se permite ampliar este rango. Esto puede ser un problema al intercambiar código y datos entre plataformas o al realizar un acceso directo al hardware. Por lo tanto, hay varios conjuntos de encabezados que proporcionan tipos de ancho exactos independientes de la plataforma. La biblioteca estándar de C proporciona stdint.h ; esto se introdujo en C99 y C ++ 11.

Ver también

Notas

Referencias