Come convertire i tipi di dati in C++

Come Convertire I Tipi Di Dati In C



Il processo di modifica del tipo di dati di una variabile in un'altra è noto come conversione di tipo o cast di tipo in C++. Questo viene fatto per eseguire operazioni matematiche sulle variabili di diversi tipi di dati, rendendo i loro tipi di dati compatibili tra loro. La conversione del tipo ottimizza il codice. Ad esempio, quando si calcola la differenza tra due variabili, se un numero è di tipo float e l'altro di tipo dati intero, il tipo di dati intero verrà convertito in tipo float per eseguire la sottrazione.

Come convertire i tipi di dati in C++

In C++, ci sono due modi per modificare i tipi di dati:

Conversione implicita del tipo

Secondo le regole predefinite dal compilatore di codice C++, la conversione di tipo implicita è la conversione di tipo eseguita automaticamente dal compilatore senza la necessità di alcun trigger esterno da parte dell'utente. Questo tipo di conversione avviene solitamente in un programma quando è presente più di un tipo di dati e il tipo di dati dell'espressione non corrisponde al tipo di dati della variabile coinvolta in questa espressione.







Per evitare la perdita di dati durante la conversione, il compilatore per impostazione predefinita modifica il tipo di dati a bassa precisione con il tipo di dati a maggiore precisione. Ad esempio, convertirà un numero intero in un numero in virgola mobile anziché modificare il numero in virgola mobile in un numero intero per evitare la perdita di dati. Questa si chiama promozione. Di seguito è riportato il diagramma di precedenza per i diversi tipi di dati.





Ordine per la conversione del tipo

L'ordine corretto per la conversione del tipo è dato come segue:





bool-- > carattere -- > breve int -- > int- > intero senza segno -- > lungo -- > senza segno lungo -- > lungo lungo -- > galleggiante -- > Doppio -- > doppio lungo

La variabile di tipo a bassa precisione viene convertita nel tipo di dati ad alta precisione per impedire la perdita di dati.

Esempio 1

In questo esempio, viene eseguita l'addizione sulla variabile di diversi tipi di dati utilizzando la conversione di tipo implicita.



#include
utilizzando spazio dei nomi standard ;

int principale ( ) {
int numero = 100 ;
car carattere = 'C' ;
cout << '100 + 'C' = ' << numero + carattere << fine ;

galleggiante val = numero + 'C' ;
cout << 'val.float(100 + 'c') = ' << val << fine ;

int era = 7890 ;
lungo non era = era ;
cout << 'var_int = ' << non era ;
ritorno 0 ;
}

Qui vengono aggiunti un numero intero e un carattere dalla tabella ASCII, un numero float e il carattere 'c'. Il numero intero viene mantenuto nel terzo segmento come tipo di dati lungo e i tipi di dati vengono modificati dal compilatore stesso in base alle sue regole predefinite.

La somma di 100 e 'C' restituisce 167 poiché la 'C' equivale a 67 in numeri e 100+'c' restituisce 199 poiché la 'c' minuscola equivale a 99. La variabile int è archiviata in un tipo di dati lungo.

Esempio 2

In questo esempio, il carattere D viene convertito in float per eseguire l'operazione di divisione.

#include
utilizzando spazio dei nomi standard ;

int principale ( ) {
car X = 'D' ;

galleggiante float_var ;

float_var = galleggiante ( X ) / 'C' ;
// Converte esplicitamente un int in un float.

cout << 'Il valore di float_var è: ' << float_var << fine ;

ritorno 0 ;
}

Il valore di input è sotto forma di carattere D che viene memorizzato nel tipo di dati float e ulteriormente diviso dal carattere C. Questi caratteri vengono modificati in valori numerici e su di essi viene eseguita un'operazione di divisione, restituendo il valore in float.

Conversione esplicita del tipo

L'utente deve modificare manualmente il tipo di dati con la conversione esplicita del tipo di C++, spesso nota come cast di tipo. Questo tipo di casting viene eseguito per evitare la conversione implicita del tipo. Esistono due metodi per eseguire il cast esplicito del tipo in C++:

  • Conversione utilizzando l'operatore di assegnazione
  • Conversione utilizzando l'operatore Cast

Conversione di tipi utilizzando l'operatore di assegnazione in C++

La conversione del tipo utilizzando l'operatore di assegnazione viene eseguita in modo forzato, ovvero un tipo di dati viene convertito manualmente in un altro. Ciò si ottiene utilizzando l'operatore di assegnazione “=”, che assegna il valore dell'operando di destra alla variabile sul lato sinistro.

Esempio
Questo programma calcola l'area del cerchio utilizzando la fusione del tipo.

#include
#include
utilizzando spazio dei nomi standard ;
int principale ( )
{
int raggio ;
cout <> raggio ;
galleggiante la zona = M_PI * raggio * raggio ;
cout << 'Area del cerchio con raggio' << raggio << ' = ' << la zona ;
}

L'operatore di assegnazione viene utilizzato per assegnare il valore float all'area, che consiste nel valore del raggio nel tipo di dati intero.

L'area del cerchio viene restituita nel tipo di dati float, mentre il raggio viene immesso nel tipo di dati integer. Pertanto, il tipo di dati della variabile viene modificato tramite il cast del tipo utilizzando l'operatore di assegnazione.

Conversione di tipi utilizzando l'operatore Cast in C++

La conversione del tipo viene eseguita utilizzando un operatore cast, che forza un tipo di dati a cambiare in un altro tipo in base alle esigenze del programma.

Esistono quattro diversi operatori di cast:

  • static_cast
  • const_cast
  • Dynamic_cast
  • reinterpret_cast

1: cast_statico

static_cast è l'operatore di casting utilizzato per convertire in modo esplicito numeri in virgola mobile e caratteri in numeri interi e così via. Questo è l'operatore di cast più elementare. Può eseguire il cast di tipi di dati di natura simile. Può convertire i puntatori da una forma all'altra, quindi può essere utilizzato anche per la gestione della memoria.

Sintassi

static_cast ( espressione )

Esempio
Questo programma è progettato per convertire una variabile double in un tipo di dati int utilizzando static_cast. Taglierà qualsiasi parte decimale nell'output.

#include
utilizzando spazio dei nomi standard ;
int principale ( )
{
// dichiara una variabile
Doppio P ;
P = 2.905 * 1.235 * 24.675 ;
galleggiante risultato ;

cout << 'Prima di utilizzare il cast statico:' << fine ;
cout << ' Il valore di p = ' << P << fine ;

// usa static_cast per convertire il tipo di dati
risultato = static_cast ( P ) ;
cout << ' Dopo aver utilizzato il cast statico: ' << fine ;
cout << ' Il valore del risultato = ' << risultato << fine ;

ritorno 0 ;
}

Inizialmente, una doppia variabile p viene caricata con valori che vengono moltiplicati tra loro e memorizzati nel risultato. Il risultato contiene il risultato prima e dopo l'operatore static_cast:

Prima di utilizzare l'operatore static_cast, il risultato viene visualizzato in punti decimali, mentre dopo aver utilizzato questo operatore viene visualizzato nel tipo di dati intero.

2: const_cast

L'operatore const_cast viene utilizzato per convertire un valore costante di un oggetto nel tipo non costante. Viene utilizzato quando viene dichiarato un oggetto costante e occasionalmente è necessario modificarne il valore.

Sintassi

const_cast ( espressione )

Esempio
In questo esempio, l'operatore const_cast viene utilizzato per rimuovere temporaneamente il qualificatore costante e consente di apportare modifiche alla variabile in base alle necessità:

#include
utilizzando spazio dei nomi standard ;
int principale ( ) {
cost int X = 70 ;
cost int * E = & X ;
cout << 'Il vecchio valore è' << * E << ' \N ' ;
int * Con = const_cast ( E ) ;
* Con = 90 ;
cout << 'Il nuovo valore è' << * E ;
ritorno 0 ;
}

Il qualificatore costante è assegnato a una variabile int x, il che significa che questa variabile non può essere modificata direttamente. Dopodiché int *y, che è un puntatore, viene utilizzato per accedere a x, ma non può ancora essere modificato e il suo valore originale viene visualizzato utilizzando cout. Utilizzando l'operatore const_cast viene creato un puntatore z che non è costante, serve per accedere al valore di x rendendolo modificabile. Cambia il valore assegnato a z con 90 che cambia indirettamente il valore in x.

Inizialmente, il valore della variabile costante x è 70 che viene modificato utilizzando l'operatore const_cast, rendendolo 90.

3: cast_dinamico

con la gerarchia dell'ereditarietà, definita anche downcast indipendente dai tipi. Il downcast è il processo di conversione di un riferimento o puntatore in una classe derivata da un riferimento o puntatore di una classe base.

Sintassi

Dynamic_cast ( espressione )

Esempio
In questo esempio, l'operatore Dynamic_cast viene utilizzato per verificare il tipo di classe polimorfica e consente l'accesso sia ai membri della classe base che a quelli derivati.

#include
#include
utilizzando spazio dei nomi standard ;
classe TBase
{
pubblico :
galleggiante base_g = 9.81 ;

virtuale vuoto manichino ( )
{

} ;
} ;

classe Tderivato : pubblico TBase
{
pubblico :
int locale_g = 9.78 ;
} ;

int principale ( )
{

TBase * base = nuovo Tderivato ;
Tderivato * derivato ;

derivato = Dynamic_cast ( base ) ;

cout < base_g << fine ;
cout < locale_g << fine ;

getchar ( ) ;
ritorno 0 ;
}

Due classi sono definite come classi base e classi derivate. Una base puntatore di tipo TBase* viene creata e assegnata a un oggetto allocato dinamicamente di tipo TDerived. Un oggetto di classe derivata può essere assegnato a un puntatore di classe base in questa istanza di polimorfismo. Il Dynamic_cast controlla se il puntatore accede all'oggetto valido di TDerived, se il cast ottiene un risultato positivo la classe derivata otterrà un risultato valido altrimenti restituirà un valore nullo.

4: reinterpretare_cast

Il reinterpret_cast trasforma un puntatore di un tipo di dati in un puntatore di un tipo di dati diverso. Non controlla se i tipi di dati dei puntatori sono gli stessi o meno. Questo operatore di casting deve essere utilizzato e maneggiato con attenzione.

Esempio
In questa illustrazione, il puntatore di un tipo di dati viene reinterpretato in un puntatore di un altro tipo di dati utilizzando reinterpret_cast:

#include
utilizzando spazio dei nomi standard ;

int principale ( )
{
int * Q = nuovo int ( 70 ) ;
car * cap = reinterpret_cast ( Q ) ;
cout << * Q << fine ;
cout << * cap << fine ;
cout << Q << fine ;
cout << cap << fine ;
ritorno 0 ;
}

Inizialmente ad un numero intero viene assegnato il valore 70. Il puntatore q punta a questo numero intero allocato dinamicamente. Il reinterpret_cast viene utilizzato per reinterpretare il puntatore q come puntatore a carattere ch, il che significa che la memoria originariamente assegnata a q viene ora trattata come se fosse un carattere. Utilizzando il comando cout, stampa il valore assegnato a qe ch. Poiché ch viene trattato come un puntatore di carattere, restituirà un valore di carattere.

Stampa il valore puntato a ch utilizzando *ch. Tuttavia, poiché ch viene trattato come un puntatore di carattere, questa riga interpreterà la memoria come un carattere. Stampa l'indirizzo di memoria memorizzato nel puntatore ch utilizzando ch. Questo è lo stesso indirizzo di memoria di q perché è solo una reinterpretazione della stessa memoria.

Inizialmente, l'intero memorizza 70. Successivamente, questo viene manipolato tra il puntatore q e il puntatore ch. Gli output 2 e 4 sono gli stessi perché il secondo valore viene reinterpretato utilizzando reinterpret_cast.

Nota : Si consiglia di non utilizzare questo operatore cast finché e a meno che non sia strettamente necessario in quanto rende l'oggetto un prodotto non trasportabile

Conclusione

Il processo di modifica del tipo di dati di una variabile in un'altra è noto come conversione di tipo o cast di tipo in C++. Questo viene fatto per eseguire operazioni matematiche sulle variabili di diversi tipi di dati, rendendo i loro tipi di dati compatibili tra loro. La conversione del tipo ottimizza il codice. Esistono conversioni di tipo implicite ed esplicite in C++. La conversione implicita del tipo viene eseguita dal compilatore stesso utilizzando un insieme predefinito di regole, mentre la conversione esplicita del tipo viene eseguita dal programmatore utilizzando operatori di assegnazione e operatori di cast.