CodeGym /Blog Java /Random-PL /Jak przekonwertować long na int w Javie
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

Jak przekonwertować long na int w Javie

Opublikowano w grupie Random-PL
W tym artykule wyjaśnimy, jak przekonwertować long na int w Javie i napiszemy kilka przykładów kodu. Ponieważ long jest większym typem danych niż int , tutaj powinniśmy użyć rzutowania typów do takiej konwersji. Jak zapewne już wiesz, zarówno long , jak i int w Javie są prymitywnymi typami danych. Oznacza to, że nie są obiektami klasy. Wszystkie obiekty i tablice są przechowywane w przestrzeni sterty, podczas gdy prymitywne typy, takie jak int i long , są przechowywane w pamięci stosu. Long i int są nieco podobne. Liczba całkowita oznacza liczbę całkowitą, która może być dodatnia, ujemna lub zero. Obie długiei int są typami całkowitymi, więc są w pewien sposób kompatybilne. Problem polega na tym, że typ długi mieści się w zakresie od -263 do 263 – 1 lub -9223372036854775808 do 9223372036854775807. Oznacza to, że program Java przydziela typowi długiemu 64 bity . Jednocześnie typ int zajmuje 32 bity, w których można umieścić liczby od -231 do 231 - 1 lub, czyli to samo, od -2147483648 do 2147483647. Oznacza to, że dowolna liczba typu int z łatwością zmieści się w długi typ. W Javie podczas pracy z prymitywami konwersja z typu węższego na szerszy jest automatyczna. W inny sposób nazywa się to poszerzeniem.

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Tutaj przypisujemy int do długiej zmiennej. Wszystko poszło gładko, w większym zakresie mniejszy spokojnie pasuje i nie tracimy nic oprócz miejsca w pamięci. Nawiasem mówiąc, kiedy deklarujemy zmienną typu long i definiujemy jej wartość, lepiej przypisać jej literę l , przyda się to, gdy pracujemy z liczbami spoza zakresu int .

long myVeryLong = 10000000000l;

Konwersja Java long na int

Wróćmy teraz do głównego zadania tego artykułu — konwersji języka Java long na int . Problem polega na tym, że coś większego nie zawsze mieści się w czymś mniejszym. Więc tutaj nie możemy po prostu automatycznie umieścić „mniejszego” w „większym” w Javie. Jeśli spróbujemy postępować jak w poprzednim przykładzie, ale odwrotnie:

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

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Kompilator Java po prostu nie pozwoli nam na to i zgłosi błąd. Więc do tej operacji musimy użyć tak zwanego rzutowania typu. Proces ten nazywany jest konwersją typów zawężających. Aby zawęzić zmienną, musisz jawnie określić typ, do którego chcesz rzutować swoją wartość. Oto przykład, w którym spróbujemy umieścić jedną „małą” liczbę long w int (która powinna się zmieścić) i dwie „duże” liczby long , które są poza zakresem 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);
   }
}
Poinformowaliśmy kompilator, że chcemy umieścić wartość long w zmiennej int i ponosimy odpowiedzialność za konsekwencje tej decyzji. Kompilator, widząc wyraźne wskazanie węższego typu, dokonuje konwersji. W rezultacie otrzymujemy dane wyjściowe:
16000 -2147483648 1410065408
Cóż, 16000 to zdecydowanie to, czego się spodziewaliśmy, ale dlaczego minus jest w -2147483648? A co oznacza ten 1410065408? Faktem jest, że takie liczby były przechowywane w długiej zmiennej, która, jak pamiętamy, zajmuje 64 bity. Próbujemy umieścić te liczby w zmiennej int , która może przechowywać tylko 32 bity. Z reguły te 32 komórki będą zawierały zera i jedynki z pierwszych 32 bitów długiej liczby , a reszta zostanie po prostu odrzucona. Dlatego jeśli oryginalna liczba nie mieści się w 32 bitach, te bity, które nie pasują, są po prostu odrzucane. Dlatego mamy tylko poprawną liczbę 16000, ponieważ zajmuje mniej niż 32 bity.

Konwersja long na int w Javie 8

W Javie 8 klasa Math ma nową metodę, która konwertuje long na int . tutaj:

Math.toIntExact(value);
Najlepszą rzeczą w tej metodzie jest to, że kontroluje długość przekonwertowanej liczby, a jeśli wartość jest zbyt duża, aby zmieścić się w int , zgłosi wyjątek. Zobaczmy, jak to działa w naszym przykładzie:

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));
   }
}
Dane wyjściowe to:
16000 Wyjątek w wątku „main” java.lang.ArithmeticException: przepełnienie liczby całkowitej w java.base/java.lang.Math.toIntExact(Math.java:1080) w intToLong.main(intToLong.java:13)
W ten sposób program wydrukował jedyną poprawnie przekonwertowaną liczbę 16000, a następnie podczas próby wypchnięcia liczby spoza zakresu 2147483648l do int metoda zgłosiła wyjątek. Nie mamy więc problemu z odrzuconymi bitami, jak w przypadku klasycznej Javy konwersji long na int .
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION