fmn ha scritto:
Vediamo se ho capito: in Java qualsiasi operazione con due operandi anche se da risultato un valore compreso tra -128 e 127, non è byte ma int?
Detto così è detto male. Ci sono una serie di regole sulla
binary numeric promotion, i quattro punti basilari sono:
- se uno degli operandi è double, l'altro è convertito a double
- altrimenti se uno degli operandi è float, l'altro è convertito a float
- altrimenti se uno degli operandi è long, l'altro è convertito a long
- altrimenti entrambi gli operandi sono convertiti a int
E non scende più sotto di int. Quindi un byte + short non fa uno short ma un int!
Per le regole complete, ti consiglio di leggere sul Java Language Specification alla sezione 5.6.2:
Binary Numeric Promotion
Questa è una di quelle cose da sapere "a menadito".
fmn ha scritto:
Ma perchè devono essere di tipo int se possono essere di tipi byte, i dati di tipo byte non occupano meno spazio nella memoria?
Forse diventano int in automatico perchè nelle oprazioni è facile superrare i valori dei file di tipo byte?
Una costante "letterale" scritta nel sorgente come es. 123 per definizione del linguaggio è una costante
int. Tutto qui. Se vuoi una costante long puoi mettere il suffisso l o (preferibilmente) L es. 123L (e ci sono anche i suffissi per costanti float e double).
Non c'è modo di specificare una costante letterale byte o short. Non ce n'è in effetti molto bisogno grazie anche alla regola speciale del narrowing implicito nell'assegnamento di una costante ad una variabile.
fmn ha scritto:
Altra domanda se non chiedo troppo, se io modifico la parte di codice che hai postato in questa maniera, la compilazione viene eseguita?
int a = 50;
int b = 2;
int r = a * b;
Qui è tutto int ... non ci sono dubbi su cosa succede.
E sì, compila perfettamente.