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 informático 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). [1]
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 . [2]
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 [a] | 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 [b] | 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 [b] | 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 [b] , int [b] | corto | Smallint | corto | pequeño | entero (2) | corto |
Sin firmar: de 0 a 65.535, lo que equivale a 2 16 - 1 | 4.82 | uint16_t, sin firmar [b] , unsigned int [b] | corto | Palabra | char [c] | 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 [b] , largo [b] | En t | LongInt ; Entero [d] | 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, sin firmar [b] , unsigned int [b] , unsigned long [b] | uint | LongWord ; DWord ; Cardenal [d] | 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 [b] , largo largo [b] | 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 [b] | 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) | ciento [e] |
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 [e] | ||||||||
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 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 utilizando matrices de variables más pequeñas, como Java. Clase BigInteger o Perl " bigint ". [5] Estos utilizan tanta memoria de la computadora como sea necesaria para almacenar los números; sin embargo, una computadora tiene solo una cantidad finita de almacenamiento, por lo que también pueden representar un subconjunto finito de los números enteros matemáticos. Los 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. [6]
Prácticamente todos los nuevos procesadores de escritorio son capaces de usar palabras de 64 bits, aunque los procesadores integrados con tamaño de palabra 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 como de largo , 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 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 no es necesario. [7] [8] Un programa conforme puede asumir que puede almacenar de forma segura valores entre - (2 15 −1) [9] y 2 15 −1, [10] pero no puede asumir 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. [6]
Lenguaje de programación | Nombre del tipo de datos | Firma | 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 | |
C# | corto | firmado | 2 | −32,768 | +32,767 |
corto | no firmado | 2 | 0 | 65.535 | |
Java | corto | 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 de largo . 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) [9] y 2 31 −1, [10] pero no puede asumir que el rango no es mayor.
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 [6] Windows , sistemas de 16/32/64 bits [6] | largo [g] | 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 [6] [8] | largo [g] | 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 [g] | 4 [12] (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 [g] | 4 [13] (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 [14] | −2,147,483,648 a +2,147,483,647 | N / A |
VBA | Estándar de la empresa | Windows , Mac OS X | Largo | 4 [15] | −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 long
se 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 long long type no existía en C ++ 03. Para un compilador compatible con ANSI / ISO, los requisitos mínimos para los rangos especificados, es decir, - (2 63 −1) [9] a 2 63 −1 para firmados y 0 a 2 64 −1 para no firmados, [10] deben sentirse satisfecho; sin embargo, se permite ampliar este rango. [16] [17] Esto puede ser un problema al intercambiar código y datos entre plataformas, o al hacer 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
- Aritmética de precisión arbitraria
- Decimal codificado en binario (BCD)
- Tipos de datos C
- Desbordamiento de enteros
- Representaciones de números firmados
Notas
- ^ No todos los dialectos SQL tienen tipos de datos sin firmar. [3] [4]
- ^ a b c d e f g h i j k l m n Los tamaños de char , corto , int , largo y long long en C / C ++ dependen de la implementación del lenguaje.
- ^ Java no admite directamente la aritmética en tipos de char . Los resultados deben devolverse a char de un int .
- ^ a b Los tamaños de Delphi's Entero y Cardinal no está garantizado, varía de una plataforma a otra; generalmente definido como LongInt y LongWord respectivamente.
- ^ a b Reservado para uso futuro. Aun 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 magnitud de signo y complemento de dos) o con todos los bits 1 (para complemento de uno) para usar como valor de "trampa", utilizado para indicar (por ejemplo) un desbordamiento. [9]
- ^ a b c d Los términos largo y int son equivalentes [11]
Referencias
- ^ Cheever, Eric. "Representación de números" . Swarthmore College . Consultado el 11 de septiembre de 2011 .
- ^ Madhusudhan Konda (2 de septiembre de 2011). "Una mirada a las nuevas características de Java 7 - O'Reilly Radar" . Radar.oreilly.com . Consultado el 15 de octubre de 2013 .
- ^ "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 .
- ^ a b c d e Niebla, 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 .
- ^ 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 .
- ^ a b Meyers, Randy (1 de diciembre de 2000). "La nueva C: enteros en C99, parte 1" . drdobbs.com . Consultado el 4 de septiembre de 2010 .
- ^ a b c d "ISO / IEC 9899: 201x" (PDF) . open-std.org. sección 6.2.6.2, párrafo 2 . Consultado el 20 de junio de 2016 .
- ^ a b c "ISO / IEC 9899: 201x" (PDF) . open-std.org. sección 5.2.4.2.1 . Consultado el 20 de junio de 2016 .
- ^ "ISO / IEC 9899: 201x" (PDF) . open-std.org . Consultado el 27 de marzo de 2013 .
- ^ "Tipos fundamentales en C ++" . cppreference.com . 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 enteros, largos y bytes (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" . Consultado el 4 de septiembre de 2010 .
- ^ "American National Standard Programming Language 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 .