Corsi on-line
Chiudi
Newsletter:
  • Seguici su Facebook
  • Seguici su Twitter
  • Seguici su Google+
  • Seguici via RSS
  • Seguici col tuo Smartphone

La numeric promotion in Java

Articolo scritto da Damiano Verda
Pagina 1 di 2

Cosa s'intende per numeric promotion? Si tratta di un'operazione molto comune all'interno di un programma e corrisponde a una conversione implicita degli operandi (ad esempio gli addendi) associati a un operatore numerico (ad esempio "+", che indica l'addizione).

Tale conversione si rende necessaria ogniqualvolta gli operandi non corrispondano esattamente al tipo di dato che ci si aspetta per l'operazione. In alcuni casi la conversione deve essere esplicita (ad esempio tramite un cast) ed è quindi a carico del programmatore.

(L'articolo continua più sotto...)

In altri casi, specie nel caso dei linguaggi di programmazione più avanzati e diffusi (ci riferiremo nel seguito in particolare al linguaggio Java), la conversione viene eseguita automaticamente, dunque in modo implicito. In questo caso è possibile parlare di numeric promotion.

Possiamo distinguere due filoni principali di numeric promotion: unary numeric promotion e binary numeric promotion, che si distinguono sostanzialmente per la natura dell'operatore aritmetico coinvolto nell'operazione (unario o binario). Esaminiamo entrambi i filoni, avendo cura di fornire anche qualche breve esempio di codice Java.

Unary numeric promotion

Vediamo subito un esempio:

byte b = 2;
int a[] = new int[b];           
Character c = '\u0001';
a[c] = 1;                       
a[0] = -c;  

Nel caso in esame, sia pure molto semplice, possiamo identificare tre esempi di unary numeric promotion. Il primo è rappresentato dall'istruzione int a[]= new int[b]. La dimensione dell'array infatti dovrebbe essere rappresentata da un numero intero (variabile di tipo int), mentre b è una variabile di tipo byte.

ln seguito, soffermiamoci sull'istruzione a[c]=-1. In questo caso viene passato come indice dell'array, ancora una volta, non un parametro di tipo intero, ma (in questo caso) di tipo Character. Analogamente, l'istruzione successiva a[0]=-c assegna alla posizione 0 dell'array a un valore di tipo Character e non di tipo int.

Osserviamo innanzitutto che si tratta di conversioni associate all'operatore di assegnazione ("="), dunque a un operatore unario, associato cioè a un solo operando. Ecco dunque perchè possiamo parlare di unary numeric promotion. In che modo il compilatore gestisce implicitamente le conversioni associate alle operazioni descritte?

In tutti e tre i casi, la conversione può essere scomposta in due passaggi elementari. Prima di tutto viene eseguita una conversione di tipo unboxing, ovvero il dato (in questo caso di tipo Byte o Character) viene convertito nel corrispondente tipo di dato primitivo (rispettivamente byte e char).

A questo punto si procede a una seconda fase di conversione: in tutti e tre i casi in esame si tratta di una widening primitive conversion. In poche parole, non si ha alcuna perdita di informazione e anzi, il nuovo tipo di dato scelto (int) è sovrabbondante rispetto all'informazione da archiviare (contenuta nella variabile b, di tipo Byte o c, di tipo Character). Proprio per questo il compilatore può eseguire la conversione autonomamente.

Sottolineiamo infatti come le uniche reali conversioni che possono essere eseguite in maniera implicita in un contesto di numeric promotion siano quelle citate. Si registra infatti anche la possibilità di una conversione di tipo identity, che però mantiene inalterato il tipo di dato della variabile in oggetto e risulta quindi di interesse prevalentemente teorico.

Corsi
Corso LinuxCorso Linux
Guida completa al sistema open-source. A partire da 39 €.
Corso PHPCorso PHP
Corso completo per la creazione di siti Web dinamici. A partire da 49 €.
Corso Ruby e Ruby On RailsCorso Ruby e Ruby On Rails
Creare software ed applicazioni Web con Ruby e ROR. A partire da 49 €.
Vedi anche...
Annunci

Mr.Webmaster

Pubblicità
Chi Siamo
Contattaci
Collabora
Note Legali
© 2003 - 2012 Mr.Webmaster - Il portale dei Webmaster Italiani - Tutti i diritti riservati | Powered by IKIweb Internet Media S.r.l. - PIVA 02848390122