JavaRush /Blog Java /Random-ES /Convertir (convertir) tipos primitivos en Java

Convertir (convertir) tipos primitivos en Java

Publicado en el grupo Random-ES
¡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:
  1. No son objetos y representan un valor almacenado en la memoria.
  2. Hay varios tipos de tipos primitivos:
    • Números enteros - byte, short, int,long
    • Números de coma flotante (fraccionarios) - floatydouble
    • Booleano -boolean
    • Simbólico (para indicar letras y números) -char
  3. 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
Pero, además de los valores, los tipos también difieren en el tamaño de la memoria. inttoma 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: Expansión y contracción de tipos primitivos - 2 hay espacio libre dentro del muñeco nido. Cuanto más grande sea la muñeca nido, más espacio tendrá. longPodemos 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 bytea una variable int. La asignación fue exitosa y sin problemas: el valor almacenado en byteocupa 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 inten 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 inta una variable shorty 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 intque ocupaba 32 bits y en formato binario se veía así: Expansión y contracción de tipos primitivos - 3 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 shortcontendrá el valor Expansión y contracción de tipos primitivos - 4, 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 intpara escribir bytey 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 ( floaty 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
El tipo chartiene un rango numérico de 0 a 65536. Pero, ¿qué significa esto? Después de todo, charestos no son solo números, sino también letras, signos de puntuación... El hecho es que los valores charse 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: Expansión y contracción de tipos primitivos - 5 Lo principal es comprender el principio de almacenamiento de valores chary 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 char16 . 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: intshortcharcharcharshortintint >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 charse almacenan en la memoria como números en el rango del 0 al 65536, representando el Unicode de nuestro personaje. Expansión y contracción de tipos primitivos - 6 Asi que aqui esta. Cuando realizamos una suma chary algún tipo de entero charse 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.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION