Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Fondamenti di Programmazione
Forum - Java - Fondamenti di Programmazione

Avatar
Voldx (Normal User)
Newbie


Messaggi: 2
Iscritto: 28/08/2017

Segnala al moderatore
Postato alle 11:54
Lunedì, 28/08/2017
Ciao a tutti ragazzi, in questo momento sto cercando di capire come mai questi due codici danno due diversi risultati.

1)short s1 = 100, s2 = 29;                                                    
short x = (short) (s1 + s2);
byte b1 = 100, b2 = 29;
byte y = (byte) (b1 + b2);
System.out.println(x==y);

Io pensavo che risulta >falso< perché short e byte hanno
dimensione diverse di bit.

2) int x = 3;
double y = 3.0;
if (x == y) System.out.println("Uguali");
else System.out.println("Diversi");

Secondo lo stesso ragionamento dovrebbe dare >Diverso<, ma risulta "Uguali" :-|:-|
perché??
Grazie a tutti :hail:

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 401
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 12:34
Lunedì, 28/08/2017
Per rispondere alle tue domande bisogna che tu conosca almeno un po' la rappresentazione dei numeri che si usa solitamente nei calcolatori.
Per tutti i tipi interi, anche di diverse dimensioni, si usa la rappresentazione in complemento 2.

La prima cosa che devi sapere è che, per facilitare la vita al programmatore, molti linguaggi permettono il confronto tra tipi di interi diversi.
Quello che succede quando confronti uno short (16 bit) con un byte (8 bit) è che il byte viene convertito temporaneamente a un short e in seguito viene operato il confronto.
Si chiama cast implicito, in questo caso è un upcast perché vai verso una dimensione superiore. Questo si applica anche a operazioni aritmetiche (ad esempio somme tra tipi diversi).
Esiste anche il downcast, che si ha quando converti un tipo a dimensione superiore a uno di dimensione inferiore, e qui bisogna stare un po' attenti perché potrebbe esserci una perdita di bit significativi.

Il motivo per cui il primo confronto fallisce quindi non è per la dimensione diversa dei tipi (prova con byte x = 1 e short y = 1) ma per la rappresentazione in complemento 2 del byte. Ti consiglio di stampare i tuoi valori di x e y e ragionare su questa cosa, dovresti arrivarci da solo.

Il caso del confronto tra intero e double è ancora diverso, perché i floating point vengono rappresentati in un modo completamente diverso. Ogni linguaggio ha le sue regole per il casting e non ricordo molto bene il java, però di solito x viene convertito a double per effettuare quel confronto.
Se si riesce a mantenere una certa precisione nel cast, il confronto funziona. Di solito però non si fa mai un confronto diretto tra double o float con ==, nemmeno quando non ci sono cast: considera questo codice
Codice sorgente - presumibilmente Java

  1. double x = 1/3;
  2.                 double y = 1;
  3.                 System.out.println(3*x==y);


Prova ad eseguirlo e vedrai che risulta falso, perché 1/3 non viene rappresentato con precisione sufficiente per poter tornare uguale a 1 con la moltiplicazione.
Quindi di solito si controlla che il valore assoluto della loro differenza sia più piccolo di una certa soglia
Codice sorgente - presumibilmente Plain Text

  1. Math.abs(x - y) < epsilon


PM Quote
Avatar
Voldx (Normal User)
Newbie


Messaggi: 2
Iscritto: 28/08/2017

Segnala al moderatore
Postato alle 12:47
Martedì, 29/08/2017
Grazie per aver risposto, sul secondo credo di aver capito qual'è il problema. Per il primo mi devo impegnare di più però mi hai dato l'input su cui partire...grazieee:):)

PM Quote