Problema con il casting

di il
5 risposte

Problema con il casting

CIAO A TUTTI!

Non riesco a capire il casting ... mi spiego meglio con un esempio.

 int a =5;
 int b =3;
 double r1 = (double) a/b; //Casting di r1 
 System.out.println("R1 casting da Int a Double = " +r1); 
 float r1bis = (float) r1;
 System.out.println("R1 casting da Double a Float = " + r1bis + " perdita dati");
Nell'esempio riportato sopra, forzo in una variabile double a/b per non perdere i valori decimali, della divisione.
Riforzo di nuovo, trasformando il valore dell'operazione da un tipo double ad un tipo flot ... CON CONSEGUENTE PERDITA DI DATI(io la chiamerei troncatura, è corretto?).

ECCO IL PROBLEMA ...
credevo che sarebbe accaduta la stessa cosa con l'esempio che riporto qui sotto ...

long tipoLong = Long.MAX_VALUE; // Assegna il valore max contenibile in un tipo long.
int tipoInt;

System.out.println("Il massimo valore che può contenere un tipo long è: " + tipoLong);
		
//Esegue il cast da Long ad Int.
tipoInt = (int) tipoLong;
	
System.out.println("tipoLong contiene: " + tipoLong + " tipoint contiene: " + tipoInt);
con mia sorpresa, il valore è -1 perchè? non riesco a capirlo. Io desideravo mantenere lo stesso valore per quel che poteva contenere(il resto troncatura).

COME POSSO FARLO?
CIAO E GRAZIE!

5 Risposte

  • Re: Problema con il casting

    nelloskybus ha scritto:


    Riforzo di nuovo, trasformando il valore dell'operazione da un tipo double ad un tipo flot ... CON CONSEGUENTE PERDITA DI DATI(io la chiamerei troncatura, è corretto?).
    Da double a float si perde in precisione. Un double ha una precisione di ~16 cifre decimali mentre un float ha una precisione di ~7 cifre decimali.

    nelloskybus ha scritto:


    con mia sorpresa, il valore è -1 perchè? non riesco a capirlo. Io desideravo mantenere lo stesso valore per quel che poteva contenere(il resto troncatura).
    Con i tipi primitivi interi, da un tipo più grande ad uno più piccolo quello che succede è una "troncatura" della parte più alta. long è a 64 bit mentre int è a 32 bit. I 32 bit più alti del long vengono letteralmente buttati via. Questo può far cambiare radicalmente il valore del int restante. Puoi perdere in magnitudo (grandezza del valore) e puoi anche perdere il segno.
  • Re: Problema con il casting

    Il motivo per cui il cast da long ad int ti restituisce -1 è quello che ha detto andbin.

    In particolare dato che i numeri sono rappresentati in "complemento a 2", si ha che il numero positivo più grande è dato dalla sequenza "01111....1", mentre il numero più piccolo è "100...0".

    Quindi se tu prendi il numero massimo possibile per il tipo "long" (64 bit) avrai una sequenza del tipo "011...1". Quando effettui il cast ad "int" (32 bit) vengono presi in considerazione solo i 32 bit meno significativi, ovvero "111....1", che, in complemento a 2, rappresenta appunto il valore -1.
  • Re: Problema con il casting

    Fischia!
    grazie, più o meno o capito, ma che posso fare per non perdere tutti quei numeri? non ci rimane nulla!
  • Re: Problema con il casting

    nelloskybus ha scritto:


    ma che posso fare per non perdere tutti quei numeri?
    Di per sé non puoi farci nulla, nel senso che passando da un tipo più grande ad uno più piccolo, "qualcosa" lo perdi. Un long di valore 3000012345 (3 miliardi e 12345) non ci starà mai in un int. E se lo converti in float mantiene la "grandezza" ma hai una spiacevole "sorpresa", diventa 3000012288, cioè ha perso in precisione.

    Tieni presente che esistono le classi BigInteger e BigDecimal, che lavorano a precisione "arbitraria" (qualunque numero di bit). Queste servono in casi particolari o in certi ambiti matematici.
    Non vorrei che adesso ti metti ad usare BigInteger/BigDecimal da tutte le parti ..... hanno i loro "contro", ovviamente.

    Quello che devi fare, in generale, è stabilire i tipi di dati da usare in modo che siano "ragionevoli" per quello che devi fare.
  • Re: Problema con il casting

    Grazie davvero ... molto gentili
Devi accedere o registrarti per scrivere nel forum
5 risposte