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

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.


Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java