Quote Originariamente inviata da newutente Visualizza il messaggio
- perchè r1 va dichiarato come double e necessita del casting sempre a double?
In:
double r1 = (double)(a/b);

r1 potrebbe essere dichiarato come int, long, float o double. In tutti questi casi il cast non è affatto obbligatorio, infatti la divisione tra due int dà come risultato un int che è assegnabile a int ma anche a long/float/double tramite cast implicito (perché sono tipi più grandi di int).

Quote Originariamente inviata da newutente Visualizza il messaggio
- perchè la moltiplicazione tra un char e uno short può essere inserita in un int e senza usare casting?
Per gli operatori binari (ovvero con 2 operandi) vale la binary numeric promotion che, senza entrare in tutti dettagli, dice che:
- se uno dei due operandi è un double, l'altro è convertito a double
- altrimenti se uno dei due operandi è un float, l'altro è convertito a float
- altrimenti se uno dei due operandi è un long, l'altro è convertito a long
- altrimenti entrambi gli operandi sono comunque convertiti come minimo a int.

Quote Originariamente inviata da newutente Visualizza il messaggio
- perchè la somma tra un int e un float può essere inserita in un float e senza usare il casting?
Idem, binary numeric promotion. Se uno è int e l'altro è float, allora il int è convertito a float. E il risultato è un float.

Quote Originariamente inviata da newutente Visualizza il messaggio
- perchè la differenza tra un double, un int e un float può essere inserita in un double senza usare il casting?
Idem, binary numeric promotion ma applicata in 2 step.

r1 è double, r2 è int, risultato: un double. r3 è float, quindi è portato a double. Risultato finale: un double.