4 Tipos de datos primitivos¶
Introducción¶
Se llaman tipos primitivos a los tipos de datos originales de un lenguaje de programación, esto es, aquellos que nos proporciona el lenguaje, java posee los siguientes:
Tipo de variable | Bytes que ocupa | Rango de valores |
---|---|---|
boolean | 1 | true, false |
char | 2 | Caracteres en Unicode |
byte | 1 | -128 a 127 |
short | 2 | -32.768 a 32.767 |
int | 4 | -2.147.483.648 a 2.147.483.647 |
long | 8 | -9·1018 a 9·1018 |
float | 4 | -3.4·1038 a 3.4·1038 |
double | 8 | -3.4·10308 a 3.4·10308 |
Enteros¶
Los tipos byte, short, int y long sirven para almacenar datos enteros. Los enteros son números sin decimales.
Un literal es un elemento de programa que representa directamente un valor:
Los literales se pueden expresar de varias maneras
- En decimal, es como se representan por defecto:
16
- En binario, anteponiendo 0b:
0b10000
- En octal, anteponiendo 0:
020
- En hexadecimal, anteponiendo 0x:
0x10
Por defecto, un literal entero es de tipo int. Si se le coloca detrás la letra L, entonces el literal será de tipo long.
- 16 es un literal entero
- 16L es un literal de tipo long
No se acepta en general asignar variables de distinto tipo pero existen excepciones. Por ejemplo, si se pueden asignar valores de variables enteras a variables enteras de un tipo superior (por ejemplo, asignar un valor int a una variable long). Pero al revés no se puede:
- Error de compilación, posible pérdida de precisión
La solución es hacer un casting. Esta operación permite convertir valores de un tipo a otro tipo, siempre y cuando sea posible:
- El casting evita el error
Hay que tener en cuenta en estos castings que si el valor asignado sobrepasa el rango del elemento, el valor convertido no tendrá ningún sentido ya que no puede almacenar todos los bits necesarios para representar ese número:
- El valor de b no tiene sentido
Si lo que asignamos a la variables es un literal, java hace una conversión implícita siempre y cuando el literal esté dentro del rango permitido para dicho tipo. Por ejemplo, el siguiente código no da error porque 127 está dentro del rango de los bytes aunque el literal sea por defecto int:
Sin embargo, el siguiente código si da error porque 128 sobrepasa el rango de los tipos byte:
A partir de Java7, se pueden usar guiones, como separador de miles, para facilitar la lectura al programador:
En el siguiente código de ejemplo, utilizamos System.out.println
para escribir en pantalla el valor de las variables:
public class Integers {
public static void main(String[] args) {
int i;
long l;
byte b;
short s;
i = 16; //(1)!
System.out.println(i);
i = 020; //(2)!
System.out.println(i);
i = 0x10; //(3)!
System.out.println(i);
i = 0b10000; //(4)!
System.out.println(i);
l = 6985742369L; //(5)!
System.out.println(l);
b = 127; //(6)!
System.out.println(b);
s = 32767; //(7)!
System.out.println(s);
i = 1200;
System.out.println(i);
b = (byte) i;
System.out.println(b); //(8)!
System.out.println(1_000_000); //(9)!
}
}
- 16 en decimal
- 20 en octal = 16 decimal
- 10 hexadecimal = 16 decimal
- 10000 binario = 16 decimal
- Si se le quita la L da error
- No da error porque está dentro del rango de los bytes aunque su valor por defecto sea int
- No da error porque está dentro del rango de los shorts aunque su valor por defecto sea int
- El valor b no tiene sentido
- Salida por consola: 1000000
Números decimales¶
Los decimales se almacenan en los tipos float y double. Los decimales no son almacenados de forma exacta por eso siempre hay un posible error y se habla de precisión. Es mucho más preciso el tipo double que el tipo float.
Para asignar valores literales a una variable decimal, hay que tener en cuenta que el separador decimal es el punto y no la coma. Es decir para asignar el valor 2,75 a la variable x se haría: x=2.75;
A un valor literal (como 1.5 por ejemplo), se le puede indicar con una f al final del número que es float (1.5f por ejemplo) o una d para indicar que es double. Si no se indica nada, un número literal siempre se entiende que es double, por lo que al usar tipos float hay que convertir los literales:
- El literal 3.49 por defecto es double
- El literal 3.49 se tiene que convertir a float
Lógicamente no podemos asignar valores decimales a tipos de datos enteros:
- Podemos mediante un casting, pero perderemos los decimales. En este caso, x valdrá 9.
El caso contrario, sin embargo, si se puede haceR:
La razón es que los tipos decimales son más grandes que los enteros, por lo que no hay problema de pérdida de valores.
Booleanos¶
Los valores booleanos o lógicos se almacenan en el tipo boolean. Sirven para indicar si algo es verdadero (true) o falso (false).
Por otro lado, a diferencia del lenguaje C, no se puede en Java asignar números a una variable booleana (en C, el valor false se asocia al número 0, y cualquier valor distinto de cero se asocia a true). Tampoco tiene sentido asignar valores de otros tipos de datos a variables booleanas mediante casting:
Caracteres¶
Los valores de tipo carácter sirven para almacenar símbolos de escritura. En Java se puede almacenar cualquier código Unicode en el tipo char.
Los literales carácter van entre comillas simples, como por ejemplo: 'a'
.
En programación, secuencias de escape es el conjunto de caracteres que en el código es interpretado con algún fin. En Java, la barra invertida \
se denomina carácter de escape, el cual indica que el carácter puesto a continuación será convertido en carácter especial o, si ya es especial, dejará de ser especial. Por ejemplo, si el carácter n
no es especial pero con la \
delante se convierte en especial ya que \n
se interpreta como un salto de línea. La \
es un carácter especial pero con otra \
delante deja de ser especial y simplemente es una barra invertida.
Carácter | Significado |
---|---|
\t | Tabulador |
\n | Salto de línea |
" | Dobles comillas |
' | Comillas simples |
\ | Barra invertida |
\udddd | Representa el carácter Unicode cuyo código es representado por dddd en hexadecimal |
Como se vio en el apartado Introducción, la descripción completa del estándar Unicode está disponible en la página web https://unicode.org/. En dicha página, encontramos las tablas de caracteres en hexadecimal en el enlace Code Charts. Para saber saber el código de los caracteres en decimal, podemos acceder al siguiente enlace: https://unicode-table-com/es. Los caracteres imprimibles son del 32 al 126 y del 161 al 255.
Para insertar el código caracteres no disponibles en el teclado, se hace de manera diferente según el Sistema Operativo:
- Linux: Ctrl+Shift y luego se pulsa u(para indicar que es Unicode) y el código Unicode en hexadecimal en el teclado numérico desactivado.
- Windows: Alt y el código Unicode en hexadecimal.
También se le puede asignar a una variable de tipo char un carácter Unicode, ya sea usando el código decimal o hexadecimal del carácter.
public class Characters {
public static void main(String[] args) {
char character;
character = 'C'; //(1)!
System.out.println(character);
character = 67; // (2)!
System.out.println(character);
character = '\u0043'; // (3)!
System.out.println(character);
character = '\n'; // (4)!
System.out.println(character);
character = '\''; // (5)!
System.out.println(character);
character = '\"'; // (6)!
System.out.println(character);
character = '"'; // (7)!
System.out.println(character);
character = '\\'; // (8)!
System.out.println(character);
character = 9752; // (9)!
System.out.println(character);
character = '\u2618'; // (10)!
System.out.println(character);
character = '☘'; // (11)!
System.out.println(character);
}
}
- Los literales carácter van entre comillas simples
- El código Unicode de la C es el 67
- El código Unicode de la C en hexadecimal es el 0043
- Carácter especial salto de línea
- Carácter especial Comillas Simples
- Carácter especial Comillas Dobles
- Carácter especial comillas dobles se puede utilizar sin el carácter de escape en un literal de carácter
- Carácter especial barra inclinada
- Código decimal del carácter trébol
- Código hexadecimal del carácter trébol
- Carácter trébol
Si necesitamos almacenar más de un carácter, entonces debemos usar otro tipo de datos que nos permite manejar cadenas de caracteres: String.
Ejercicio 1
Muestra en consola los siguientes caracteres
- ❤
- ☂
- ☎
- ♞
En Java, las cadenas no se modelan como un dato de tipo primitivo, sino a través de la clase String. El texto es uno de los tipos de datos más importantes y por ello java lo trata de manera especial. Para Java, las cadenas de texto son objectos especiales. Los textos deben manejarse creando objetos de tipo String.
Los literales cadena se escriben entre comillas dobles: "Esto es un literal cadena
".
Ejemplo:
En Java existe también la cadena vacía o nula(""), es decir, una cadena sin ningún carácter. Ejemplo: String s = "";
A la variable s se le está asignando la cadena vacía o nula.
Ejercicio 2
Sea MAX una constante que vale 1000, a,b e i variables enteras, x una variable decimal, c una variable carácter y s una variable cadena. Indicar las sentencias válidas y su valor, razonando la respuesta. Suponer que a = 3 y b = 4.
- i = (900 - MAX) / a
- i = b / 0
- i = a % (MAX - 900)
- i = (MAX - 900) % a
- i = 3.34 * a
- x = a / b
- x = a % (a / b)
- i = a / b
- i = ++a
- i = a++
- c = '''
- c = '"'
- s = 'c'
- s = "'"
- s = """
- c = '\u0041'
- c = 65