CodeGym /Java-blogg /Tilfeldig /Hvordan konvertere long til int i Java
John Squirrels
Nivå
San Francisco

Hvordan konvertere long til int i Java

Publisert i gruppen
I denne artikkelen skal vi forklare hvordan du konverterer long til int i Java og skriver noen kodeeksempler. Siden long er en større datatype enn int , bør vi her bruke typecasting for slik konvertering. Som du sikkert allerede vet er både long og int i Java primitive datatyper. Det betyr at de ikke er klasseobjekter. Alle objekter og matriser lagres i Heap Space, mens primitive typer som int og long er lagret i Stack-minnet. Long og int er litt like. Heltall betyr et helt tall, som kan være positivt, negativt eller null. Begge langeog int er heltallstyper, så de er kompatible på en måte. Problemet er at den lange typen varierer fra -263 til 263 – 1, eller -9223372036854775808 til 9223372036854775807. Det vil si at Java-programmet tildeler 64 biter for en lang type. Samtidig opptar int type 32 biter, der du kan sette tall fra -231 til 231 - 1 eller, som er det samme, fra -2147483648 til 2147483647. Dette betyr at et hvilket som helst antall int- type lett kan passe inn i en lang type. I Java, når du arbeider med primitiver, er konverteringen fra en smalere type til en bredere type automatisk. På en annen måte kalles det utvidelse.

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Her tilordner vi en int til en lang variabel. Alt gikk knirkefritt, i et større utvalg, en mindre passer stille og vi mister ikke noe annet enn minneplass. Forresten, når vi erklærer en variabel av typen lang og definerer dens verdi, er det bedre å tilordne bokstaven l til den, dette vil komme godt med når vi jobber med tall utenfor int- området.

long myVeryLong = 10000000000l;

Java long til int konvertering

La oss nå gå tilbake til hovedoppgaven til denne artikkelen - Java long to int- konvertering. Problemet er at noe større ikke alltid passer inn i noe mindre. Så her kan vi ikke bare sette "mindre" inn i "større" automatisk i Java. Hvis vi prøver å handle som i forrige eksempel, men omvendt:

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

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Java-kompilator vil bare ikke la oss gjøre dette og vil gi en feil. Så for denne operasjonen må vi bruke det som kalles typecasting. Denne prosessen kalles innsnevringstypekonvertering. For å begrense en variabel, må du spesifisere eksplisitt typen du vil overføre verdien til. Her er et eksempel hvor vi skal prøve å sette en "liten" lang til int (som skal passe inn) og to "store" lange tall som er utenfor int- området.

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);
   }
}
Vi har varslet kompilatoren at vi ønsker å sette den lange verdien inn i en int- variabel og vi er ansvarlige for konsekvensene av denne beslutningen. Kompilatoren, som ser en eksplisitt indikasjon på en smalere type, utfører konverteringen. Som et resultat får vi utgangen:
16000 -2147483648 1410065408
Vel, 16000 er definitivt det vi forventet å se, men hvorfor er minus i -2147483648? Og hva betyr denne 1410065408? Faktum er at slike tall ble lagret i en lang variabel, som, som vi husker, tar 64 biter. Vi prøver å sette disse tallene inn i en int- variabel som bare kan lagre 32 biter. Som regel vil disse 32 cellene inneholde nuller og enere fra de første 32 bitene av det lange tallet, og resten vil ganske enkelt bli forkastet. Derfor, hvis det opprinnelige nummeret ikke passer inn i 32 biter, blir de bitene som ikke passer ganske enkelt forkastet. Derfor har vi bare det riktige tallet 16000, siden det tar opp mindre enn 32 biter.

Java 8 long til int konvertering

I Java 8 har Math- klassen en ny metode som vil konvertere long til int . Her er det:

Math.toIntExact(value);
Det beste med denne metoden er at den kontrollerer lengden på det konverterte tallet, og hvis verdien er for stor til å passe inn i en int , vil den gi et unntak. La oss se hvordan dette fungerer i vårt eksempel:

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));
   }
}
Utgangen er:
16000 Unntak i tråden "main" java.lang.ArithmeticException: heltallsoverløp på java.base/java.lang.Math.toIntExact(Math.java:1080) på intToLong.main(intToLong.java:13)
Dermed skrev programmet ut det eneste riktig konverterte tallet 16000, og når du forsøkte å presse nummeret 2147483648l utenfor rekkevidden inn i int , ga metoden et unntak. Så vi har ikke problemet med forkastede biter, som i tilfellet med klassisk Java long to int- konvertering.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION