Tipi primitivi: range di rappresentazione
DOMANDA:
Quali sono i range di valori rappresentabili dai tipi di dati primitivi Java?
RISPOSTA:
Benché non siano facilissimi da ricordare, è importante sapere i limiti di rappresentazione dei diversi tipi per prevenire o evitare di trovarsi a fronteggiare errori di calcolo difficilmente individuabili.
Ecco una tabella riepilogativa dei diversi range:
- BYTE (8 bit): da -128 a 127
- SHORT (16 bit): da -32.768 a 32.767
- INT (32 bit): da -2.147.483.648 a 2.147.483.647
- LONG (64 bit): da -9.223.372.036.854.774.808 a 9.223.372.036.854.774.807
- FLOAT (32 bit): da 1,4e-045 a 3,4e+038
- DOUBLE (64 bit): da 4,9e-324 a 1,8e+308
- CHAR (16 bit) - Unicode: da 0 a 65.536
- BOOLEAN (1 bit): true o false
Ed ecco cosa succede a sbagliare il tipo di dato in un calcolo:
public class RangeTest { public static void main(String[] args) { short s1 = 100; short s2 = 29; short somma1 = (short) (s1 + s2); System.out.println(somma1); byte b1 = 100; byte b2 = 29; byte somma2 = (byte) (b1 + b2); System.out.println(somma2); } }
L'output sarà:
129
-127
-127
Il primo risultato è giusto, ma il secondo?
Dato che i byte possono rappresentare i valori da -128 a 127, 100 + 29 = 129, quindi ho sforato (overflow) di 2 il limite massimo e ho ricominciato a contare da -128 ottenendo il risultato di -127... come potete immaginare un errore di questo tipo è gravissimo perché fornisce risultati totalmente sballati, con conseguenze disastrose!
Se siete interessati a conoscere un modo per superare questi limiti di rappresentazione, vi consiglio di leggere questo post.
Se siete interessati a conoscere un modo per superare questi limiti di rappresentazione, vi consiglio di leggere questo post.
Commenti
Posta un commento