CodeGym /Blog Java /Random-ES /Cómo convertir largo a int en Java
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

Cómo convertir largo a int en Java

Publicado en el grupo Random-ES
En este artículo, explicaremos cómo convertir long a int en Java y escribiremos algunos ejemplos de código. Dado que long es un tipo de datos más grande que int , aquí deberíamos usar la conversión de tipos para dicha conversión. Como probablemente ya sepa, tanto long como int en Java son tipos de datos primitivos. Eso significa que no son objetos de clase. Todos los objetos y matrices se almacenan en Heap Space, mientras que los tipos primitivos, como int y long, se almacenan en la memoria de pila. Long e int son algo similares. Entero significa número entero, que puede ser positivo, negativo o cero. Ambos largose int son tipos enteros, por lo que son compatibles en cierto modo. El problema es que el tipo largo va de -263 a 263 – 1, o -9223372036854775808 a 9223372036854775807. Es decir, el programa Java asigna 64 bits para un tipo largo . A su vez, el tipo int ocupa 32 bits, en los que puedes poner números desde -231 до 231 - 1 o, lo que es lo mismo, desde -2147483648 hasta 2147483647. Esto significa que cualquier número de tipo int puede caber fácilmente en un tipo largo . En Java, cuando se trabaja con primitivas, la conversión de un tipo más estrecho a un tipo más ancho es automática. De otra manera, se llama ensanchamiento.

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Aquí estamos asignando un int a una variable larga . Todo transcurrió sin problemas, en un rango más grande, uno más pequeño cabe tranquilo y no perdemos nada excepto espacio de memoria. Por cierto, cuando declaramos una variable de tipo long y definimos su valor, es mejor asignarle la letra l , esto nos vendrá bien cuando trabajemos con números fuera del rango int .

long myVeryLong = 10000000000l;

Conversión de Java largo a int

Ahora volvamos a la tarea principal de este artículo: la conversión de Java largo a int . El problema es que algo más grande no siempre encaja en algo más pequeño. Así que aquí no podemos simplemente poner "más pequeño" en "más grande" automáticamente en Java. Si tratamos de actuar como en el ejemplo anterior, pero viceversa:

//example without typecasting…nice trying! 
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
El compilador de Java simplemente no nos permitirá hacer esto y arrojará un error. Entonces, para esta operación, necesitamos usar lo que se llama encasillamiento. Este proceso se denomina conversión de tipo de estrechamiento. Para restringir una variable, debe especificar explícitamente el tipo al que desea convertir su valor. Aquí hay un ejemplo en el que vamos a tratar de poner un número largo "pequeño" en int ( que debe caber) y dos números largos "grandes" que están fuera del rango de int .

public class longToInt {

   public static void main(String[] args) {

       int myInt = 18;
       long myLong = 16000;
       long myVeryLong = 2147483648l;//l in the end means ‘long’ 
       long myVeryLong = 10000000000l;

       myInt = (int) myLong;
       System.out.println(myInt);
       myInt = (int) oneMoreLong;
       System.out.println(myInt);
       myInt = (int) myVeryLong;
       System.out.println(myInt);
   }
}
Hemos notificado al compilador que queremos poner el valor largo en una variable int y somos responsables de las consecuencias de esta decisión. El compilador, al ver una indicación explícita de un tipo más estrecho, realiza la conversión. Como resultado, obtenemos la salida:
16000 -2147483648 1410065408
Bueno, 16000 es definitivamente lo que esperábamos ver, pero ¿por qué es menos en -2147483648? ¿Y qué significa este 1410065408? El hecho es que tales números se almacenaron en una variable larga que, como recordamos, ocupa 64 bits. Estamos tratando de poner estos números en una variable int que solo puede almacenar 32 bits. Como regla general, estas 32 celdas contendrán ceros y unos de los primeros 32 bits del número largo , y el resto simplemente se descartará. Por lo tanto, si el número original no cabe en 32 bits, los bits que no encajan simplemente se descartan. Por eso solo tenemos el número correcto 16000, ya que ocupa menos de 32 bits.

Java 8 conversión larga a int

En Java 8, la clase Math tiene un nuevo método que convertirá long a int . Aquí lo tienes:

Math.toIntExact(value);
Lo mejor de este método es que controla la longitud del número convertido y, si el valor es demasiado grande para caber en un int , generará una excepción. Veamos cómo funciona esto en nuestro ejemplo:

public class intToLong {

   public static void main(String[] args) {

       int myInt = 18;
       long myLong = 16000;
       long oneMoreLong = 2147483648l;
       long myVeryLong = 10000000000l;
      
       System.out.println(Math.toIntExact(myLong));
       int y = Math.toIntExact(oneMoreLong);
       System.out.println(oneMoreLong);
       System.out.println(Math.toIntExact(myVeryLong));
   }
}
La salida es:
16000 Excepción en el subproceso "principal" java.lang.ArithmeticException: desbordamiento de enteros en java.base/java.lang.Math.toIntExact(Math.java:1080) en intToLong.main(intToLong.java:13)
Por lo tanto, el programa imprimió el único número convertido correctamente, 16000, y luego, al intentar insertar el número fuera de rango 2147483648l en int , el método generó una excepción. Así que no tenemos el problema de los bits descartados, como en el caso de la conversión clásica de Java largo a int .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION