La conversione in C è unica, a differenza di altre lingue. Inoltre non è mai intelligente.
La conversione in C converte i valori da un tipo a un altro utilizzando regole accuratamente definite. Se hai davvero bisogno di sapere, leggi lo standard. Altrimenti i punti principali sono:
- La conversione tra tipi interi conserva il valore, se possibile. Se la destinazione ha più bit questo è più ampio e generalmente sicuro, ma potrebbe comportare l'estensione del segno. Se più stretto, i bit andranno persi.
- La conversione tra i tipi di puntatore mantiene il valore del puntatore, ma i risultati sono spesso indefiniti, spesso non portabili e spesso utili per scenari avanzati.
- La conversione tra tipi interi e puntatori è OK se il numero intero è abbastanza grande e preserva il modello di bit (qualunque cosa ciò possa significare). Se il numero intero è troppo piccolo, il risultato non è definito ma non utile. Di regola, "long" è abbastanza largo per "void *", ma nessuna garanzia! I puntatori creati in questo modo potrebbero non essere validi, in tutti i tipi di modi interessanti.
- La conversione tra tipi float e interi è una conversione aritmetica definita da una routine di libreria appropriata (con troncamento, non arrotondamento).
- È possibile eseguire il cast del valore restituito di una funzione per annullare. Non ho mai. Non fa niente.
Alcuni cast sono applicati implicitamente e in alcuni di questi il compilatore emetterà un avvertimento. Meglio badare agli avvertimenti!
La definizione del dizionario per cast è meglio ignorata, in quanto non utile. Molti cast sono meglio descritti dai termini conversione o coercizione, quindi vale la pena di conoscerli anche quelli.
C ++ è MOLTO più complicato, ma non l'hai chiesto, vero?