# C/Conversioni di tipo

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
Il C è un linguaggio debolmente tipizzato, questo significa che una variabile di un tipo può essere vista dal programma come di altro tipo e convertita in un altro tipo (operazione detta casting).
In C esistono due tipi di conversioni di tipo:
* Conversioni automatiche o implicite
* Cast: conversione esplicita

## Conversioni implicite

Quando un operatore ha operandi di tipo diverso, questi vengono convertiti in un tipo comune. In generale, le uniche conversioni automatiche sono quelle che trasformano un operando "più piccolo" in uno "più grande" in modo da non avere perdite di informazione. Per quanto riguarda i tipi base la conversione automatica segue il seguente schema:
char → short → int → long → float → double
in particolare nelle assegnazioni se il valore a destra dell'operatore di assegnamento è di un tipo di quelli più a sinistra nello schema e il valore a sinistra è di un tipo di quelli più a destra la conversione è automatica.
Un'altra conversione di tipo automatica è da void *, puntatore a tipo vuoto, verso puntatori a qualsiasi altro tipo e da puntatori a qualsiasi tipo a void *.
Quindi assegnazioni di tale tipo sono lecite:

## Cast

Si tratta del metodo definito dal linguaggio per forzare una conversione a un tipo non automatica. La sintassi è la seguente:
un esempio ne mostra l'utilità:
se non si fosse fatto il cast il risultato di 3/2 avrebbe dato 1 invece di 1,5 in quanto è vero che la conversione al tipo reale (float) è automatica, ma non quella del risultato della divisione tra interi, che dà 1. Basta però che uno solo dei due operandi sia un numero reale che l'intera operazione sia convertita a un numero reale.
In generale la conversione da puntatori a un oggetto a un tipo e viceversa devono essere esplicite. Lo standard afferma che non dovrebbe essere permesso fare un cast di un puntatore a funzione verso un oggetto che non sia un puntatore a funzione e viceversa, e comunque se ciò fosse permesso dal compilatore dipenderebbe dall'implementazione. Inoltre è permesso fare il cast di un intero a un puntatore e viceversa ma il risultato dipende dall'implementazione (non è portabile).
L'unico cast garantito è quello della costante 0 a un puntatore che definisce un puntatore nullo ossia:
è lecito e inoltre il codice precedente può essere semplificato in
poiché in tal caso è prevista la conversione implicita.

### Un esempio di conversione di puntatori a funzione

Il cast di un puntatore a funzione potrebbe sembrare un po' innaturale a un principiante quindi se ne mostra la sintassi generale:
gli elementi dell'elenco dei tipi degli argomenti devono essere separati dalla virgola e può contenere anche ... che indica un numero variabil di argomenti. Segue un esempio: