CodeGym /Java Blogu /Rastgele /Java'da long'u int'ye dönüştürme
John Squirrels
Seviye
San Francisco

Java'da long'u int'ye dönüştürme

grupta yayınlandı
Bu yazımızda Java'da long'un int'e nasıl dönüştürüleceğini açıklayacağız ve bazı kod örnekleri yazacağız. long , int'den daha büyük bir veri türü olduğundan , burada bu tür bir dönüşüm için tür atama kullanmalıyız. Muhtemelen zaten bildiğiniz gibi Java'da hem long hem de int ilkel veri türleridir. Bu, sınıf nesneleri olmadıkları anlamına gelir. Tüm Nesneler ve diziler Yığın Alanında saklanırken, int ve long gibi ilkel türler Yığın belleğinde saklanır. Long ve int biraz benzerdir. Tamsayı, pozitif, negatif veya sıfır olabilen tam sayı anlamına gelir. ikisi de uzunve int tamsayı türleridir, bu nedenle bir şekilde uyumludurlar. Sorun, uzun türün -263 ila 263 – 1 veya -9223372036854775808 ila 9223372036854775807 arasında olmasıdır. Yani, Java programı uzun bir tür için 64 bit ayırır. Aynı zamanda, int tipi 32 bit kaplar ve buna -231 ile 231 - 1 arasında veya -2147483648 ile 2147483647 arasında aynı olan sayıları koyabilirsiniz. uzun tip. Java'da, ilkellerle çalışırken, daha dar bir türden daha geniş bir türe dönüşüm otomatiktir. Diğer bir deyişle genişleme denir.

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Burada uzun bir değişkene bir int atayacağız . Her şey sorunsuz gitti, daha geniş bir aralıkta, daha küçük olan sessizce uyuyor ve hafıza alanı dışında hiçbir şey kaybetmiyoruz. Bu arada, long türünde bir değişken bildirip değerini tanımladığımızda, ona l harfini atamak daha iyidir , int aralığı dışındaki sayılarla çalışırken bu kullanışlı olacaktır .

long myVeryLong = 10000000000l;

Java uzundan int'e dönüştürme

Şimdi bu makalenin ana görevine geri dönelim - Java'yı uzundan int'ye dönüştürme . Sorun şu ki, daha büyük bir şey her zaman daha küçük bir şeye sığmaz. Yani burada Java'da otomatik olarak "daha küçük"ü "daha büyük"e koyamayız. Önceki örnekteki gibi davranmaya çalışırsak, ancak tersi:

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

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Java derleyicisi bunu yapmamıza izin vermeyecek ve bir hata verecektir. Dolayısıyla, bu işlem için, typecasting denen şeyi kullanmamız gerekiyor. Bu işleme daraltma türü dönüştürme denir. Bir değişkeni daraltmak için, değerinizi atamak istediğiniz türü açıkça belirtmeniz gerekir. İşte int'ye bir "küçük" uzun (uyması gereken) ve int aralığının dışında olan iki "büyük" uzun sayı koymaya çalışacağımız bir örnek .

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);
   }
}
Uzun değeri bir int değişkenine koymak istediğimizi derleyiciye bildirdik ve bu kararın sonuçlarından biz sorumluyuz. Daha dar bir türün açık bir göstergesini gören derleyici, dönüştürmeyi gerçekleştirir. Sonuç olarak şu çıktıyı alıyoruz:
16000 -2147483648 1410065408
Pekala, 16000 kesinlikle görmeyi beklediğimiz bir değer, ama -2147483648'de neden eksi var? Peki bu 1410065408 ne anlama geliyor? Gerçek şu ki, bu tür sayılar , hatırladığımız gibi 64 bit alan uzun bir değişkende saklanıyordu . Bu sayıları sadece 32 bit depolayabilen bir int değişkenine koymaya çalışıyoruz . Kural olarak, bu 32 hücre, uzun sayının ilk 32 bitinden sıfırlar ve birler içerecek ve geri kalanı basitçe atılacaktır. Bu nedenle, orijinal sayı 32 bite sığmazsa, sığmayan bitler basitçe atılır. Bu nedenle, 32 bitten daha az yer kapladığından, yalnızca doğru sayı olan 16000'e sahibiz.

Java 8 uzundan int'e dönüştürme

Java 8'de, Math sınıfının long'u int'e dönüştürecek yeni bir yöntemi vardır . İşte burada:

Math.toIntExact(value);
Bu yöntemin en iyi yanı, dönüştürülen sayının uzunluğunu kontrol etmesi ve değer bir int'e sığmayacak kadar büyükse bir istisna atmasıdır. Örneğimizde bunun nasıl çalıştığını görelim:

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));
   }
}
Çıktı:
16000 "main" java.lang.ArithmeticException iş parçacığında istisna: java.base/java.lang.Math.toIntExact(Math.java:1080) adresinde intToLong.main(intToLong.java:13) adresinde tamsayı taşması
Böylece, program doğru şekilde dönüştürülmüş tek sayı olan 16000'i yazdırdı ve ardından 2147483648l aralık dışı sayıyı int'e itmeye çalışırken , yöntem bir istisna attı. Bu nedenle, klasik Java'dan int'ye uzun dönüşümde olduğu gibi atılan bit sorunumuz yok .
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION