Tipi di dati primitivi

Java definisce otto tipi di dati primitivi:

tipi interi: byte, short, int, long

tipi floating point (o a virgola mobile): floate double

tipo testuale: char

tipo logico-booleano: boolean

 

- Tipi di dati interi, casting e promotion

I tipi di dati interi sono ben quattro: byte,short, int, long. Essi condividono la stessafunzionalità (tutti possono immagazzinare numeriinteri positivi o negativi), ma differiscono per quantoriguarda il proprio intervallo di rappresentazione. Infatti, unbyte può immagazzinare un intero utilizzando unbyte (otto bit), uno short due byte, un intquattro byte ed un long otto byte. Lo schemaseguente riassume dettagliatamente i vari intervalli dirappresentazione:

    byte 8 bit -128,..,+127

    short 16 bit -32.768,..,+32.767

    int 32 bit-2.147.483.648,..,+2.147.483.647

    long 64 bit-9.223.372.036.854.775.808,..,9.223.372.036.854.775.807

Per immagazzinare un intero, si possono utilizzare treforme: decimale, ottale ed esadecimale. Per la notazioneottale basta anteporre al numero intero uno 0 (zero),mentre per la notazione esadecimale, zero e x(indifferentemente maiuscola o minuscola). Ecco qualcheesempio d’utilizzo di tipi interi:

byte b=10; //notazione decimale
short s=022; //notazione ottale
int i=1000000000; //notazione decimale
long l=0x12acd; //notazione esadecimale

C’è da fare però una precisazione.Facciamo un esempio:

byte b=50;

Questo statement è corretto. Il numero intero50 è tranquillamente compreso nell’intervallodi rappresentazione di un byte che va da –128 a+127. Il compilatore determina la grandezza del valorenumerico, e controlla se è compatibile con il tipo didato dichiarato. Allora, consideriamo quest’altrostatement:

b=b*2;

Ciò darà luogo ad un errore in compilazione!Infatti, il compilatore non eseguiràl’operazione di moltiplicazione per controllare lacompatibilità con il tipo di dato dichiarato,bensì, promuoverà automaticamente la cifra chesi trova alla destra dell’espressione di assegnazionead int, dato che di default assumerà che 2sia un int. Quindi, se 50*2 è unint, non può essere immagazzinato in b cheè un byte. Il fenomeno appena descrittoè conosciuto sotto il nome di "promozioneautomatica nelle espressioni". Ma, evidentemente,50*2 è immagazzinabile tranquillamente in unbyte. Esiste una tecnica per forzare una certaquantità, ad essere immagazzinata in un certo tipo didato. Questa tecnica è nota con il nome di"cast" (o "casting"). La sintassi dautilizzare per risolvere il nostro problema è:

b=(byte)b*2;

In questo modo, il compilatore sarà avvertito cheun’eventuale perdita di precisione è calcolata esotto controllo.

Bisogna essere però molto prudentinell’utilizzare il casting in modo corretto. Infatti sescrivessimo:

b=(byte)128;

il compilatore non segnalerà nessun tipo di errore.In realtà, siccome il cast agisce troncando i bit ineccedenza (nel nostro caso, siccome un int utilizza 32bit, mentre un byte solo 8, saranno troncati i primi24 bit dell’int), la variabile bavrà il valore di –128 e non di128!

Notare che, se utilizziamo una variabile long, ameno di cast espliciti, sarà sempre inizializzata conun intero. Quindi se scriviamo:

long l=2000;

Dobbiamo tener ben presente che 2000 è un intper default, ma il compilatore non ci segnaleràerrori perché un int in un longpuò essere tranquillamente immagazzinato. Per laprecisione dovremmo scrivere:

long l=(long)2000;

oppure con una sintassi equivalente:

long l=2000L;

Quindi, un cast a long, è possibile ancheposponendo una "elle" maiuscola o minuscola dopo ilvalore intero assegnato. Si preferisce utilizzare lanotazione maiuscola, dato che una "elle" minuscolasi può confondere con un numero "uno" inalcuni ambienti di sviluppo. Notare che saremo obbligati adun cast a long, nel caso in cui volessimo assegnarealla variabile l un valore fuori dell’intervallodi rappresentazione di un int.

 

- Tipi di dati a virgola mobile, casting epromotion

Java per i valori floating point utilizza lo standard didecodifica IEEE-754. I due tipi che possiamo utilizzaresono:

    float 32 bit

    double 64 bit

E’ possibile utilizzare la notazione esponenziale oingegneristica (la "e" può essere siamaiuscola sia minuscola). Per quanto riguarda cast epromotion, la situazione cambia rispetto al caso dei tipiinteri. Il default è double e non float.Ciò implica che se vogliamo assegnare un valore avirgola mobile ad un float non possiamo fare a meno diun cast. Per esempio la seguente riga di codice, porterebbead un errore in compilazione:

float f=3.14;

Anche in questo caso, il linguaggio ci viene incontropermettendoci il cast con la sintassi breve:

float f=3.14F;

La "effe" può essere sia maiuscola siaminuscola.

Esiste, per quanto ridondante, anche la forma contrattaper i double, infatti:

double d=10.12E24;

è equivalente a scrivere:

double d=10.12E24D;

N.B. : ciò che sembra evidente è che ilnostro non sia il linguaggio ideale per fare dei calcoli! Unaltro classico problema che potrebbe presentarsi, èquando si dividono due numeri interi. Il risultato infattisarà sicuramente un numero intero! Consiglio saggio:in caso di espressioni aritmetiche, utilizzare solamentedouble. In altri tempi questo consiglio sarebbe statoconsiderato folle…

- Tipo di dato logico - booleano

Il tipo di dato boolean, utilizza solo un bit permemorizzare un valore, e gli unici valori che puòimmagazzinare sono true e false. Peresempio:

boolean b=true;

- Tipo di dato primitivo letterale

Il tipo char ci permette di immagazzinare caratteri(uno per volta). Utilizza l’insieme Unicode per ladecodifica. Unicode è uno standard a 16 bit, checontiene tutti i caratteri della maggior parte degli alfabetidel mondo. Fortunatamente l’insieme ASCII, cheprobabilmente è più familiare al lettore,è un sottoinsieme dello Unicode. I primi 256 caratteridei due insiemi coincidono. Per maggiori informazioni,visitare il sito www.unicode.org .

Possiamo assegnare ad un char un qualsiasicarattere che si trova sulla nostra tastiera, oppurepassargli direttamente una cifra Unicode in esadecimale cheidentifica univocamente un determinato carattere, anteponendoad essa il prefisso "u". In qualsiasi caso,dobbiamo comprendere tra apici singoli, il valore daassegnare. Ecco qualche esempio:

 

char primoCarattere=’a’;    char car=’@’;    char carattereUnicodeNonIdentificato=’uABC8’;

 

Esiste anche la possibilità di immagazzinarecaratteri di escape come:

    ‘ ’ che equivale ad andare acapo

    ‘’ che equivale ad un solo

    ‘ ’ che equivale ad unatabulazione

    ‘’’ che equivale ad unapice singolo

    ‘"’ che equivale ad undoppio apice (virgolette)

    . . .

N.B.: notare che è possibile inserire un caratterein una certa espressione aritmetica, per esempio, sommareun char con un int. Infatti ad ogni caratterecorrisponde un numero intero.