Introducción a los Tipos Primitivos
1. Introducción
El lenguaje de programación Java cuenta con ocho tipos de datos primitivos.
En este tutorial, examinaremos qué son estos tipos primitivos y repasaremos cada uno de ellos.
2. Tipos de Datos Primitivos
Los ocho tipos primitivos definidos en Java son int, byte, short, long, float, double, boolean y char. No se consideran objetos y representan valores en bruto.
Se almacenan directamente en la pila o stack (más información respecto a la gestión de memoria en este artículo).
Echaremos un vistazo al tamaño de almacenamiento, los valores por defecto y ejemplos de cómo usar cada tipo.
Comencemos con una rápida referencia:
Tipo | Tamaño (bits) | Mínimo | Máximo | Ejemplo |
---|---|---|---|---|
byte | 8 | -27 | 27– 1 | byte b = 100; |
short | 16 | -215 | 215– 1 | short s = 30_000; |
int | 32 | -231 | 231– 1 | int i = 100_000_000; |
long | 64 | -263 | 263– 1 | long l = 100_000_000_000_000; |
float | 32 | -2-149 | (2-2-23)·2127 | float f = 1.456f; |
double | 64 | -2-1074 | (2-2-52)·21023 | double f = 1.456789012345678; |
char | 16 | 0 | 216– 1 | char c = ‘c’; |
boolean | 1 | – | – | boolean b = true; |
2.1. int
El primer tipo de datos primitivo que vamos a cubrir es int. También conocido como un número entero, el tipo int almacena una amplia gama de valores numéricos no fraccionarios.
Específicamente, Java lo almacena utilizando 32 bits de memoria. En otras palabras, puede representar valores desde -2_147_483_648 (-231) hasta 2_147_483_647 (231-1).
En Java 8, es posible almacenar un valor entero sin signo de hasta 4_294_967_295 (232-1) utilizando nuevas funciones especiales auxiliares.
Podemos declarar simplemente un int:
int x = 424_242;
int y;
El valor por defecto de un int declarado sin asignación es 0.
Si la variable se define en un método, debemos asignar un valor antes de poder usarla.
Podemos realizar todas las operaciones aritméticas estándar en ints. Sin embargo, debemos tener en cuenta que los valores decimales serán truncados cuando se realicen estas operaciones en números enteros.
2.2. byte
byte es un tipo de datos primitivo similar a int, excepto que ocupa solo 8 bits de memoria. Por eso lo llamamos un byte. Debido a que el tamaño de la memoria es tan pequeño, byte solo puede contener valores desde -128 (-27) hasta 127 (27 – 1).
Así es como podemos crear un byte:
byte b = 100;
byte empty;
El valor por defecto de byte también es 0.
2.3. short
La siguiente parada en nuestra lista de tipos de datos primitivos en Java es short.
Si queremos ahorrar memoria y byte es demasiado pequeño, podemos usar el tipo a medio camino entre byte e int: short.
Con 16 bits de memoria, es la mitad del tamaño de int y el doble del tamaño de byte. Su rango de valores posibles es de -32_768(-215) a 32_767(215–1).
short se declara de la siguiente manera:
short s = 20_020;
short s;
También similar a los otros tipos, el valor por defecto es 0. Podemos usar toda la aritmética estándar en él también.
2.4. long
Nuestro último tipo de datos primitivo relacionado con los enteros es long.
long es el hermano mayor de int. Se almacena en 64 bits de memoria, por lo que puede contener un conjunto significativamente más grande de posibles valores.
Los valores posibles de un long están entre -9_223_372_036_854_775_808 (-263) y 9_223_372_036_854_775_807 (263 –1).
Podemos simplemente declarar uno:
long l = 1_234_567_890;
long l;
Al igual que con otros tipos de enteros, el valor por defecto es también 0. Podemos usar toda la aritmética en long que funciona en int.
2.5. float
Representamos números fraccionarios básicos en Java usando el tipo float. Este es un número decimal de precisión simple. Esto significa que si superamos las seis cifras decimales, el número se vuelve menos preciso y más una estimación.
En la mayoría de los casos, no nos importa la pérdida de precisión. Pero si nuestros cálculos requieren una precisión absoluta (por ejemplo, operaciones financieras, aterrizaje en la luna, etc.), debemos utilizar tipos específicos diseñados para este trabajo. (más información respecto a las classes BigDecimal y BigInteger en las próximas lecciones).
Este tipo se almacena en 32 bits de memoria al igual que int. Sin embargo, debido al punto decimal flotante, su rango es muy diferente. Puede representar números tanto positivos como negativos. El decimal más pequeño es 1.40239846 x 10-45, y el valor más grande es 3.40282347 x 1038.
Declararemos floats de la misma manera que cualquier otro tipo:
float f = 3.145f;
float f;
Y el valor por defecto es 0.0 en lugar de 0. También, observa que agregamos la designación f al final del número literal para definir un float. De lo contrario, Java arrojará un error porque el tipo predeterminado de un valor decimal es double.
También podemos realizar todas las operaciones aritméticas estándar en floats. Sin embargo, es importante tener en cuenta que realizamos la aritmética en punto flotante de manera muy diferente a la aritmética entera.
2.6. double
A continuación, vemos double. Su nombre proviene del hecho de que es un número decimal de doble precisión.
Se almacena en 64 bits de memoria. Esto significa que representa una gama mucho más amplia de números posibles que float.
Aunque sufre de la misma limitación de precisión que float. El rango es de 4.9406564584124654 x 10-324 a 1.7976931348623157 x 10308. Ese rango también puede ser positivo o negativo.
Declarar double es igual que otros tipos numéricos:
double d = 3.13457599923384753929348D;
double d;
El valor por defecto es también 0.0 como lo es con float. Similar a float, adjuntamos la letra D para designar el literal como un double.
2.7. boolean
El tipo de datos primitivo más simple es boolean. Solo puede contener dos valores: true o false. Almacena su valor en un solo bit.
Sin embargo, por conveniencia, Java rellena el valor y lo almacena en un solo byte.
Así es como declaramos boolean:
boolean b = true;
boolean b;
Declararlo sin un valor por defecto es false. boolean es la piedra angular para controlar el flujo de nuestros programas. Podemos usar operadores booleanos en ellos (por ejemplo, &&, ||, etc.).
2.8. char
El último tipo de datos primitivos a considerar es char.
También llamado carácter, char es un entero de 16 bits que representa un carácter codificado en Unicode. Su rango va desde 0 hasta 65_535. En Unicode, esto representa '\u0000' a '\uffff'.
Para obtener una lista de todos los posibles valores Unicode, consulta sitios web como Unicode Table.
Ahora declaremos un char:
char c = 'a';
char c = 65;
char c;
Cuando definimos nuestras variables, podemos usar cualquier carácter literal, y se transformarán automáticamente en su codificación Unicode para nosotros. El valor por defecto de un carácter es '/u0000'.
2.9. Desbordamiento (Overflow)
Los tipos de datos primitivos tienen límites de tamaño. Pero, ¿qué sucede si intentamos almacenar un valor que es más grande que el valor máximo?
Nos encontramos con una situación llamada desbordamiento (overflow).
Cuando un entero se desborda, vuelve al valor mínimo y comienza a contar desde allí.
Los números en coma flotante se desbordan devolviendo Infinity:
int i = Integer.MAX_VALUE;
int j = i + 1;
// La variable 'j' volverá a -2_147_483_648
double d = Double.MAX_VALUE;
double o = d + 1;
// La variable 'o' será Infinity
El subdesbordamiento (underflow) es el mismo problema, pero implica almacenar un valor más pequeño que el valor mínimo. Cuando los números enteros se desbordan, devuelven el número más alto almacenable. Los decimales, sin embargo, devuelven 0.0
2.10. Autoboxing
Cada tipo de datos primitivo también tiene una implementación completa de clase Java que puede envolverlo. Por ejemplo, la clase Integer puede envolver un int. A veces es necesario convertir el tipo primitivo a su envoltorio de objeto (por ejemplo, usarlos con genéricos, los cuales veremos en próximas lecciones).
Afortunadamente, Java puede realizar esta conversión automáticamente por nosotros, un proceso llamado Autoboxing:
Character c = 'c';
Integer i = 1;
3. Conclusión
En este artículo, hemos cubierto los ocho tipos de datos primitivos admitidos en Java.
Estos son los bloques de construcción utilizados por la mayoría, si no todos, los programas Java, por lo que vale la pena comprender cómo funcionan.