Cosa significa cast?

17

Quando si codifica in linguaggi di basso livello come l'IC, trovare che il casting a volte significa "reinterpretare questi byte come se fosse sempre stato di questo altro tipo" e altre volte come "convertire questo valore in modo intelligente in questo altro tipo".

Qual è il significato originale della parola e c'è una certa coerenza in quando aspettarsi una conversione e quando aspettarsi una reinterpretazione cruda?

    
posta Alexander Torstling 17.01.2014 - 08:13
fonte

4 risposte

9

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:

  1. 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.
  2. 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.
  3. 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.
  4. La conversione tra tipi float e interi è una conversione aritmetica definita da una routine di libreria appropriata (con troncamento, non arrotondamento).
  5. È 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?

    
risposta data 19.01.2014 - 13:43
fonte
2

Questa parte del dizionario Webster fornisce la definizione corretta:

a : to give a shape to (a substance) by pouring in liquid or plastic form into a mold and letting harden without pressure
b : to form by this process

Quindi, prima del casting, il tuo "oggetto" (non letteralmente un oggetto OOP) si trova in una determinata forma (tipo). Quando lo si rielabora, significa "versa cemento" attorno ad esso per trasformarlo in una nuova forma, questo è ciò che fai col casting. Hai un numero come numero intero a forma di esagono e dopo il lancio otterrai una stringa a forma di rettangolo.

    
risposta data 17.01.2014 - 12:10
fonte
2

Potrebbe essere utile separare i cast di C in due gruppi:

  1. Calchi numerici: converti un numero tra una rappresentazione e l'altra, cercando di mantenere il valore. Ad esempio: (int)3.1 sarebbe 3 . Ci sono regole esatte che definiscono cosa succede quando il valore esatto non può essere mantenuto.

  2. Trasmetti i puntatori - Mantieni l'indirizzo di memoria, ma cambia il modo in cui è deferito. Ad esempio, per float x=3.5 , *(int *)&x darà 1080033280 - questo intero è rappresentato dallo stesso pattern di bit che rappresenta il float 3.5 .

risposta data 19.01.2014 - 14:44
fonte
1
cast (v): to receive form in a mold

In C ++ i vari tipi di cast possono essere resi più espliciti, con reinterpret_cast che significa "tratta questi byte come se fossero già quest'altra cosa". In C puoi renderlo assolutamente esplicito usando un union , il casting con l'operatore (type) cercherà di mantenere il risultato numericamente equivalente, fino alla perdita di precisione.

    
risposta data 17.01.2014 - 08:54
fonte

Leggi altre domande sui tag