CodeGym/Java Blog/Random-IT/Come convertire long in int in Java
John Squirrels
Livello 41
San Francisco

Come convertire long in int in Java

Pubblicato nel gruppo Random-IT
membri
In questo articolo, spiegheremo come convertire long in int in Java e scriveremo alcuni esempi di codice. Poiché long è un tipo di dati più grande di int , qui dovremmo usare il casting di tipo per tale conversione. Come probabilmente già saprai, sia long che int in Java sono tipi di dati primitivi. Ciò significa che non sono oggetti di classe. Tutti gli oggetti e gli array sono archiviati in Heap Space mentre i tipi primitivi come int e long sono archiviati nella memoria Stack. Long e int sono in qualche modo simili. Intero significa numero intero, che può essere positivo, negativo o zero. Entrambi lunghie int sono tipi interi, quindi sono compatibili in un certo senso. Il problema è che il tipo lungo va da -263 a 263 – 1, o da -9223372036854775808 a 9223372036854775807. Cioè, il programma Java alloca 64 bit per un tipo lungo . Allo stesso tempo, il tipo int occupa 32 bit, in cui è possibile inserire numeri da -231 a 231 - 1 o, che è lo stesso, da -2147483648 a 2147483647. Ciò significa che qualsiasi numero di tipo int può facilmente rientrare in un tipo lungo . In Java, quando si lavora con le primitive, la conversione da un tipo più ristretto a un tipo più ampio è automatica. In un altro modo, si chiama allargamento.
int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Qui stiamo assegnando un int a una variabile long . Tutto è andato liscio, in una gamma più ampia, una più piccola si adatta tranquillamente e non perdiamo nulla tranne lo spazio di memoria. A proposito, quando dichiariamo una variabile di tipo long e ne definiamo il valore, è meglio assegnarle la lettera l , questo tornerà utile quando lavoriamo con numeri al di fuori dell'intervallo int .
long myVeryLong = 10000000000l;

Conversione Java da long a int

Torniamo ora all'attività principale di questo articolo: la conversione da Java long a int . Il problema è che qualcosa di più grande non sempre entra in qualcosa di più piccolo. Quindi qui non possiamo semplicemente mettere "più piccolo" in "più grande" automaticamente in Java. Se proviamo ad agire come nell'esempio precedente, ma viceversa:
//example without typecasting…nice trying!
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Il compilatore Java semplicemente non ci consente di farlo e genererà un errore. Quindi, per questa operazione, dobbiamo usare quello che viene chiamato typecasting. Questo processo è chiamato conversione del tipo di restringimento. Per restringere una variabile, è necessario specificare in modo esplicito il tipo a cui si desidera eseguire il cast del valore. Ecco un esempio in cui cercheremo di inserire un numero lungo "piccolo" in int (che dovrebbe rientrare) e due numeri lunghi "grandi" che non rientrano nell'intervallo 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);
   }
}
Abbiamo notificato al compilatore che vogliamo inserire il valore long in una variabile int e siamo responsabili delle conseguenze di questa decisione. Il compilatore, vedendo un'indicazione esplicita di un tipo più ristretto, esegue la conversione. Di conseguenza, otteniamo l'output:
16000 -2147483648 1410065408
Bene, 16000 è sicuramente quello che ci aspettavamo di vedere, ma perché è meno in -2147483648? E cosa significa questo 1410065408? Il fatto è che tali numeri sono stati memorizzati in una variabile lunga , che, come ricordiamo, richiede 64 bit. Stiamo cercando di inserire questi numeri in una variabile int che può memorizzare solo 32 bit. Di norma, queste 32 celle conterranno zeri e uno dei primi 32 bit del numero lungo e il resto verrà semplicemente scartato. Pertanto, se il numero originale non rientra in 32 bit, i bit che non rientrano vengono semplicemente scartati. Ecco perché abbiamo solo il numero corretto 16000, poiché occupa meno di 32 bit.

Conversione Java 8 da long a int

In Java 8, la classe Math ha un nuovo metodo che convertirà long in int . Ecco qui:
Math.toIntExact(value);
La cosa migliore di questo metodo è che controlla la lunghezza del numero convertito e se il valore è troppo grande per entrare in un int , genererà un'eccezione. Vediamo come funziona nel nostro esempio:
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));
   }
}
L'uscita è:
16000 Eccezione nel thread "main" java.lang.ArithmeticException: integer overflow in java.base/java.lang.Math.toIntExact(Math.java:1080) in intToLong.main(intToLong.java:13)
Pertanto, il programma ha stampato l'unico numero convertito correttamente 16000 e quindi, durante il tentativo di inserire il numero fuori intervallo 2147483648l in int , il metodo ha generato un'eccezione. Quindi non abbiamo il problema dei bit scartati, come nel caso della classica conversione Java da long a int .
Commenti
  • Popolari
  • Nuovi
  • Vecchi
Devi avere effettuato l'accesso per lasciare un commento
Questa pagina non ha ancora commenti