În acest articol, vom explica cum să convertim long în int în Java și vom scrie câteva exemple de cod. Deoarece long este un tip de date mai mare decât int , aici ar trebui să folosim tipul de turnare pentru o astfel de conversie. După cum probabil știți deja, atât long cât și int în Java sunt tipuri de date primitive. Asta înseamnă că nu sunt obiecte de clasă. Toate obiectele și matricele sunt stocate în spațiul heap, în timp ce tipurile primitive, cum ar fi int și long , sunt stocate în memoria stivă. Long și int sunt oarecum similare. Întregul înseamnă un număr întreg, care poate fi pozitiv, negativ sau zero. Ambele lungiși int sunt tipuri întregi, deci sunt compatibile într-un fel. Problema este că tipul lung variază de la -263 la 263 – 1, sau de la -9223372036854775808 la 9223372036854775807. Adică, programul Java alocă 64 de biți pentru un tip lung . În același timp, tipul int ocupă 32 de biți, în care puteți pune numere de la -231 până la 231 - 1 sau, ceea ce este același, de la -2147483648 la 2147483647. Aceasta înseamnă că orice număr de tip int se poate încadra cu ușurință într-un tip lung. În Java, atunci când lucrați cu primitive, conversia de la un tip mai îngust la un tip mai larg este automată. În alt fel, se numește lărgire.

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Aici atribuim un int unei variabile lungi . Totul a decurs bine, intr-o gama mai mare, una mai mica se potriveste linistit si nu pierdem nimic in afara de spatiu de memorie. Apropo, atunci când declarăm o variabilă de tip long și definim valoarea acesteia, este mai bine să îi atribuim litera l , acest lucru va fi util atunci când lucrăm cu numere în afara intervalului int .

long myVeryLong = 10000000000l;

Conversie Java long în int

Acum să revenim la sarcina principală a acestui articol - conversia Java long to int . Problema este că ceva mai mare nu se potrivește întotdeauna în ceva mai mic. Deci aici nu putem pune automat „mai mic” în „mare” în Java. Dacă încercăm să acționăm ca în exemplul anterior, dar invers:

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

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Compilatorul Java pur și simplu nu ne va lăsa să facem acest lucru și va arunca o eroare. Deci, pentru această operație, trebuie să folosim ceea ce se numește tipar. Acest proces se numește conversie de tip îngustare. Pentru a restrânge o variabilă, trebuie să specificați în mod explicit tipul căruia doriți să vă distribuiți valoarea. Iată un exemplu în care vom încerca să punem un lung „mic” la int (care ar trebui să se potrivească) și două numere lungi „mari” care sunt în afara intervalului 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);
   }
}
Am anunțat compilatorul că dorim să punem valoarea lungă într-o variabilă int și suntem responsabili pentru consecințele acestei decizii. Compilatorul, văzând o indicație explicită a unui tip mai restrâns, efectuează conversia. Ca rezultat, obținem rezultatul:
16000 -2147483648 1410065408
Ei bine, 16000 este cu siguranță ceea ce ne așteptam să vedem, dar de ce este minus în -2147483648? Și ce înseamnă acest 1410065408? Cert este că astfel de numere au fost stocate într-o variabilă lungă , care, după cum ne amintim, are 64 de biți. Încercăm să punem aceste numere într-o variabilă int care poate stoca doar 32 de biți. De regulă, aceste 32 de celule vor conține zerouri și unu din primii 32 de biți ai numărului lung , iar restul vor fi pur și simplu aruncate. Prin urmare, dacă numărul original nu se încadrează în 32 de biți, atunci acei biți care nu se potrivesc sunt pur și simplu aruncați. De aceea avem doar numărul corect 16000, deoarece ocupă mai puțin de 32 de biți.

Conversie Java 8 long în int

În Java 8, clasa Math are o nouă metodă care va converti long în int . Iată-l:

Math.toIntExact(value);
Cel mai bun lucru despre această metodă este că controlează lungimea numărului convertit, iar dacă valoarea este prea mare pentru a se potrivi într-un int , va arunca o excepție. Să vedem cum funcționează acest lucru în exemplul nostru:

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));
   }
}
Ieșirea este:
16000 Excepție în firul „principal” java.lang.ArithmeticException: depășire întreg la java.base/java.lang.Math.toIntExact(Math.java:1080) la intToLong.main(intToLong.java:13)
Astfel, programul a tipărit singurul număr convertit corect 16000, iar apoi, când a încercat să împingă numărul în afara intervalului 2147483648l în int , metoda a aruncat o excepție. Deci nu avem problema biților aruncați, ca în cazul conversiei Java clasice long to int .