¡Hola! Mientras navegaba por JavaRush, se encontró con tipos primitivos más de una vez. Aquí hay una breve lista de lo que sabemos sobre ellos:
Pero, además de los valores, los tipos también difieren en el tamaño de la memoria.
El tipo
- No son objetos y representan un valor almacenado en la memoria.
- Hay varios tipos de tipos primitivos:
- Números enteros -
byte
,short
,int
,long
- Números de coma flotante (fraccionarios) -
float
ydouble
- Booleano -
boolean
- Simbólico (para indicar letras y números) -
char
- Números enteros -
- Cada uno de ellos tiene su propio rango de valores:
tipo primitivo | Tamaño en memoria | Rango de valores |
---|---|---|
byte | 8 bits | -128 a 127 |
corto | 16 bits | a -32768 a 32767 |
carbonizarse | 16 bits | de 0 a 65536 |
En t | 32 bits | de -2147483648 a 2147483647 |
largo | 64 bits | de -9223372036854775808 a 9223372036854775807 |
flotar | 32 bits | de (2 elevado a -149) a ((2-2 elevado a -23)*2 elevado a 127) |
doble | 64 bits | de (-2 elevado a 63) a ((2 elevado a 63) - 1) |
booleano | 8 (cuando se usa en matrices), 32 (cuando se usa en no matrices) | verdadero o falso |
int
toma más de byte
. A long
- más de short
. La cantidad de memoria que ocupan los primitivos se puede comparar con la de los muñecos nido: hay espacio libre dentro del muñeco nido. Cuanto más grande sea la muñeca nido, más espacio tendrá. long
Podemos poner fácilmente uno más pequeño dentro de un muñeco nido grande int
. Se ajusta fácilmente y no necesitas hacer nada extra. En Java, cuando se trabaja con primitivas, esto se denomina conversión automática. De otra manera se le llama expansión. Aquí hay un ejemplo de extensión simple:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
Aquí asignamos un valor byte
a una variable int
. La asignación fue exitosa y sin problemas: el valor almacenado en byte
ocupa menos espacio de memoria del que “cabe” en int
. La “pequeña muñeca nido” (valor byte
) cabe fácilmente en la “gran matrioska” (variable int
). Otra cuestión es cuando intentas hacer lo contrario: poner un valor grande en una variable que no está diseñada para tales tamaños. En principio, este truco no funcionará con muñecos nido reales, pero en Java funcionará, pero con matices. Intentemos poner un valor int
en una variable short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//¡error!
System.out.println(bigNumber);
}
¡Error! El compilador entiende que está intentando hacer algo no estándar y coloca una muñeca matrioska grande ( int
) dentro de una pequeña ( short
). Un error de compilación en este caso es una advertencia del compilador: “ Oye, ¿estás seguro de que quieres hacer esto? “Si está seguro, dígaselo al compilador: “¡ Todo está bien, sé lo que estoy haciendo!” Este proceso se llama conversión de tipo explícita o reducción . Para realizar una reducción, debe indicar explícitamente el tipo al que desea convertir su valor. En otras palabras, responde a la pregunta del compilador: “ Bueno, ¿en cuál de estos muñequitos quieres poner este muñeco grande?” ” En nuestro caso se verá así:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
Indicamos explícitamente que queremos ajustar el valor int
a una variable short
y asumir la responsabilidad de ello. El compilador, al ver una indicación explícita de un tipo más restringido, realiza una conversión. ¿Cuál será el resultado? Salida de la consola: -27008 Un poco inesperado. ¿Por qué exactamente así? En realidad es simple. Teníamos el valor original: 10000000. Estaba almacenado en una variable int
que ocupaba 32 bits y en formato binario se veía así: Escribimos este valor en la variable short
, ¡pero solo puede almacenar 16 bits! En consecuencia, allí solo se moverán los primeros 16 bits de nuestro número, el resto se descartará. Como resultado, la variable short
contendrá el valor , que en forma decimal es exactamente igual a -27008. Es por eso que el compilador "pidió confirmación" en forma de una conversión explícita a un tipo específico. En primer lugar, muestra que usted asume la responsabilidad del resultado y, en segundo lugar, le dice al compilador cuánto espacio asignar al convertir tipos. Después de todo, si en el último ejemplo hubiésemos hecho la conversión int
para escribir byte
y no para short
, tendríamos sólo 8 bits a nuestra disposición, no 16, y el resultado habría sido diferente. Para los tipos fraccionarios ( float
y double
), el estrechamiento ocurre de manera diferente. Si intenta convertir dicho número a un tipo entero, su parte fraccionaria se descartará.
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
Salida de consola: 2
tipo de datos carácter
Ya sabes que el tipo char se utiliza para mostrar caracteres individuales.public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
Pero tiene una serie de características que es importante comprender. Miremos nuevamente la tabla con rangos de valores:
tipo primitivo | Tamaño en memoria | Rango de valores |
---|---|---|
byte | 8 bits | -128 a 127 |
corto | 16 bits | -32768 a 32767 |
carbonizarse | 16 bits | de 0 a 65536 |
En t | 32 bits | de -2147483648 a 2147483647 |
largo | 64 bits | de -9223372036854775808 a 9223372036854775807 |
flotar | 32 bits | de (2 elevado a -149) a ((2-2 elevado a -23)*2 elevado a 127) |
doble | 64 bits | de (-2 elevado a 63) a ((2 elevado a 63)-1) |
booleano | 8 (cuando se usa en matrices), 32 (cuando se usa en no matrices) | verdadero o falso |
char
tiene un rango numérico de 0 a 65536. Pero, ¿qué significa esto? Después de todo, char
estos no son solo números, sino también letras, signos de puntuación... El hecho es que los valores char
se almacenan en Java en formato Unicode. Ya nos encontramos con Unicode en una de las conferencias anteriores. Probablemente recuerdes que Unicode es un estándar de codificación de caracteres que incluye caracteres de casi todos los idiomas escritos del mundo. En otras palabras, se trata de una lista de códigos especiales en la que hay un código para casi cualquier carácter de cualquier idioma. La tabla Unicode general es muy grande y, por supuesto, no es necesario aprenderla de memoria. Aquí, por ejemplo, hay una parte de esto: Lo principal es comprender el principio de almacenamiento de valores char
y recordar que conociendo el código de un símbolo específico, siempre puedes obtenerlo en el programa. Intentemos esto con algún número aleatorio:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
Salida de la consola: 耰 Este es el formato en el que se almacenan los caracteres en Java char
. Cada carácter corresponde a un número: un código numérico de 16 bits o dos bytes. Unicode 32816 corresponde al carácter 耰. Presta atención a este momento. En este ejemplo utilizamos la variable int
. Ocupa 32 bits de memoria , mientras que char
16 . Aquí elegimos porque el número que necesitamos, 32816, está fuera de rango . Aunque el tamaño , como el corto, es de 16 bits, no hay números negativos en el rango, por lo que el rango “positivo” es el doble de grande (65536 en lugar de 32767 ). Podemos usar , siempre que nuestro código esté dentro del rango de 65536. Pero si creamos un número , ocupará más de 16 bits. Y al reducir los tipos: int
short
char
char
char
short
int
int >65536
char c = (char) x;
los bits sobrantes se descartarán y el resultado será bastante inesperado.
Características de la suma de caracteres y números enteros.
Veamos este ejemplo inusual:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
Salida de consola: 50 O_O ¿Dónde está la lógica? 1+1, ¿de dónde salió 50? Ya sabes que los valores char
se almacenan en la memoria como números en el rango del 0 al 65536, representando el Unicode de nuestro personaje. Asi que aqui esta. Cuando realizamos una suma char
y algún tipo de entero char
se convierte al número que le corresponde en Unicode. Cuando en nuestro código agregamos 1 y '1', el símbolo '1' se transformó a su código, que es 49 (puedes comprobarlo en la tabla de arriba). Por lo tanto, el resultado fue igual a 50. Tomemos una vez más a nuestro viejo amigo -耰como ejemplo e intentemos sumarlo con algún número.
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
Salida de la consola: 33016 Ya hemos descubierto que corresponde al código 32816. Y cuando sumamos este número y 200, obtenemos exactamente nuestro resultado: 33016 :) El mecanismo de operación, como puede ver, es bastante simple.
GO TO FULL VERSION