Kako pretvoriti tipove podataka u C++

Kako Pretvoriti Tipove Podataka U C



Proces promjene tipa podataka jedne varijable u drugu poznat je kao pretvorba tipa ili pretvaranje tipa u C++. Ovo se radi kako bi se izvršile matematičke operacije na varijablama različitih tipova podataka, čineći njihove tipove podataka međusobno kompatibilnim. Pretvorba tipa optimizira kod. Na primjer, kada izračunavate razliku između dvije varijable, ako je jedan broj u tipu podataka s pomičnim zamahom, a drugi u tipu podataka s pomičnim brojem, tada će se tip podataka za cijeli broj pretvoriti u tip podataka s pomičnim zamahom kako bi se izvršilo oduzimanje.

Kako pretvoriti tipove podataka u C++

U C++-u postoje dva načina za promjenu tipova podataka:

Implicitna pretvorba tipa

Prema unaprijed definiranim pravilima prevodioca C++ koda, implicitna pretvorba tipa je pretvorba tipa koju automatski provodi prevodilac bez potrebe za vanjskim okidačem od strane korisnika. Ova vrsta pretvorbe obično se odvija u programu kada postoji više od jednog tipa podataka, a tip podataka izraza ne odgovara tipu podataka varijable uključene u ovaj izraz.







Kako bi se izbjegao gubitak podataka tijekom pretvorbe, kompajler prema zadanim postavkama mijenja tip podataka niske preciznosti s tipom podataka veće preciznosti. Na primjer, pretvorit će cijeli broj u float radije nego promijeniti float u cijeli broj kako bi se spriječio gubitak podataka. To se zove promocija. Slijedi dijagram prvenstva za različite tipove podataka.





Narudžba za pretvorbu tipa

Ispravan redoslijed za pretvorbu tipa dan je kao:





bool -- > char -- > kratki int -- > int -- > unsigned int -- > dugo -- > dugo bez potpisa -- > dugo dugo -- > plutati -- > dvostruko -- > duga dvostruka

Varijabla tipa niske preciznosti pretvara se u vrstu podataka visoke preciznosti kako bi se spriječio gubitak podataka.

Primjer 1

U ovom primjeru, zbrajanje se izvodi na varijabli različitih tipova podataka pomoću implicitne konverzije tipa.



#include
korištenjem imenski prostor std ;

int glavni ( ) {
int broj = 100 ;
char lik = 'C' ;
cout << '100 + 'C' = ' << broj + lik << endl ;

plutati val = broj + 'c' ;
cout << 'float val(100 + 'c') = ' << val << endl ;

int bio je = 7890 ;
dugo nije = bio je ;
cout << 'var_int = ' << nije ;
povratak 0 ;
}

Ovdje se dodaje cijeli broj i znak iz ASCII tablice, te broj s pomičnim pomakom i znak 'c'. Cijeli broj se čuva u trećem segmentu kao dugi tip podataka, a tipove podataka mijenja sam kompilator na temelju svojih unaprijed definiranih pravila.

Zbroj 100 i 'C' vraća 167 jer je 'C' jednako 67 u brojevima, a 100+'c' vraća 199 jer je malo 'c' jednako 99. Varijabla int pohranjena je u dugom tipu podataka.

Primjer 2

U ovom primjeru, znak D se pretvara u float za izvođenje operacije dijeljenja.

#include
korištenjem imenski prostor std ;

int glavni ( ) {
char x = 'D' ;

plutati float_var ;

float_var = plutati ( x ) / 'c' ;
// Eksplicitno pretvaranje int u float.

cout << 'Vrijednost float_var je: ' << float_var << endl ;

povratak 0 ;
}

Ulazna vrijednost je u obliku znaka D koji je pohranjen u tipu podataka float i dalje podijeljen znakom C. Ti se znakovi mijenjaju u numeričke vrijednosti i na njima se izvodi operacija dijeljenja, vraćajući vrijednost u float.

Eksplicitna pretvorba tipa

Korisnik mora ručno promijeniti tip podataka C++-ovom eksplicitnom konverzijom tipa, često poznatom kao pretvaranje tipa. Ova vrsta kastinga se radi kako bi se izbjegla implicitna konverzija tipa. Postoje dvije metode za izvođenje eksplicitnog pretvaranja tipa u C++:

  • Pretvorba pomoću operatora dodjele
  • Pretvorba pomoću Cast Operatora

Pretvorba tipa pomoću operatora dodjele u C++

Pretvorba tipa pomoću operatora dodjele vrši se prisilno, to jest, jedan tip podataka se ručno pretvara u drugi. To se postiže korištenjem operatora dodjele “=”, koji vrijednost desnog operanda dodjeljuje varijabli na lijevoj strani.

Primjer
Ovaj program izračunava površinu kruga pomoću lijevanja tipa.

#include
#include
korištenjem imenski prostor std ;
int glavni ( )
{
int radius ;
cout <> radius ;
plutati područje = M_PI * radius * radius ;
cout << 'Površina kruga s radijusom' << radius << ' = ' << područje ;
}

Operator dodjele koristi se za dodjeljivanje float vrijednosti području, koje se sastoji od vrijednosti polumjera u integer tipu podataka.

Površina kruga se vraća u tipu podataka float, dok se radijus unosi u tipu podataka integer. Dakle, tip podataka varijable mijenja se pretvaranjem tipa pomoću operatora dodjele.

Pretvorba tipa korištenjem Cast operatora u C++

Pretvorba tipa vrši se korištenjem cast operatora, koji prisiljava jedan tip podataka da se promijeni u drugi tip prema potrebama programa.

Postoje četiri različita Cast operatera:

  • statično_cast
  • const_cast
  • dinamički_cast
  • reinterpret_cast

1: statično_cast

Static_cast je operator pretvaranja koji se koristi za eksplicitno pretvaranje float-ova i znakova u cijele brojeve i tako dalje. Ovo je najosnovniji cast operator. Može pretvoriti tipove podataka koji su slične prirode. Može pretvarati pokazivače iz jednog oblika u drugi, pa se može koristiti i za upravljanje memorijom.

Sintaksa

statično_cast ( izraz )

Primjer
Ovaj program napravljen je za pretvaranje dvostruke varijable u int tip podataka pomoću static_cast. Odrezat će svaki decimalni dio u izlazu.

#include
korištenjem imenski prostor std ;
int glavni ( )
{
// deklariramo varijablu
dvostruko str ;
str = 2,905 * 1,235 * 24,675 ;
plutati proizlaziti ;

cout << 'Prije upotrebe statičkog pretvaranja:' << endl ;
cout << ' Vrijednost p = ' << str << endl ;

// koristite static_cast za pretvaranje tipa podataka
proizlaziti = statično_cast ( str ) ;
cout << ' Nakon korištenja statičkog pretvaranja: ' << endl ;
cout << ' Vrijednost rezultata = ' << proizlaziti << endl ;

povratak 0 ;
}

U početku se dvostruka varijabla p učitava s vrijednostima koje se međusobno množe i pohranjuju u rezultat. Rezultat sadrži rezultat prije i nakon operatora static_cast:

Prije korištenja static_cast operatora rezultat se prikazuje u decimalnim točkama, dok se nakon korištenja ovog operatora prikazuje u cjelobrojnom tipu podataka.

2: const_cast

Operator const_cast koristi se za pretvaranje konstantne vrijednosti objekta u tip koji nije konstantan. Koristi se tamo gdje je deklariran konstantan objekt, a moramo povremeno promijeniti njegovu vrijednost.

Sintaksa

const_cast ( izraz )

Primjer
U ovom primjeru, operator const_cast koristi se za privremeno uklanjanje konstantnog kvalifikatora i dopušta izmjene u varijabli prema potrebi:

#include
korištenjem imenski prostor std ;
int glavni ( ) {
konst int x = 70 ;
konst int * i = i x ;
cout << 'Stara vrijednost je ' << * i << ' \n ' ;
int * S = const_cast ( i ) ;
* S = 90 ;
cout << 'Nova vrijednost je ' << * i ;
povratak 0 ;
}

Kvalifikator konstante dodijeljen je int varijabli x što znači da se ova varijabla ne može izravno mijenjati. Nakon toga int *y koji je pokazivač koristi se za pristup xu, ali se i dalje ne može mijenjati, a njegova izvorna vrijednost se prikazuje pomoću cout. Pomoću operatora const_cast kreira se pokazivač z koji nije konstantan, koristi se za pristup vrijednosti x što ga čini uređivačkim. Mijenja vrijednost dodijeljenu z s 90 što neizravno mijenja vrijednost u x.

Inicijalna vrijednost konstantne varijable x je 70 koja se mijenja pomoću operatora const_cast, čime postaje 90.

3: dinamički_cast

s hijerarhijom nasljeđivanja, koja se također naziva i sigurna vrsta. Prevođenje prema dolje je proces pretvaranja reference ili pokazivača u izvedenu klasu iz reference osnovne klase ili pokazivača.

Sintaksa

dinamički_cast ( izraz )

Primjer
U ovom primjeru, operator dynamic_cast koristi se za provjeru tipa polimorfne klase i dopušta pristup i osnovnim i izvedenim članovima klase.

#include
#include
korištenjem imenski prostor std ;
razreda TBase
{
javnost :
plutati baza_g = 9.81 ;

virtualan poništiti lutka ( )
{

} ;
} ;

razreda TIzvedeno : javnost TBase
{
javnost :
int lokalni_g = 9.78 ;
} ;

int glavni ( )
{

TBase * baza = novi TIzvedeno ;
TIzvedeno * izveden ;

izveden = dinamički_cast ( baza ) ;

cout < baza_g << endl ;
cout < lokalni_g << endl ;

getchar ( ) ;
povratak 0 ;
}

Dvije su klase definirane kao osnovne i izvedene klase. Baza pokazivača tipa TBase* se stvara i dodjeljuje dinamički dodijeljenom objektu tipa TDerived. Objekt izvedene klase može se dodijeliti pokazivaču osnovne klase u ovom primjeru polimorfizma. Dynamic_cast provjerava pristupa li pokazivač valjanom objektu TDerived, ako cast dobije uspješan rezultat, izvedena klasa će dobiti valjan rezultat, inače će vratiti nultu vrijednost.

4: reinterpret_cast

Reinterpret_cast transformira pokazivač jednog tipa podataka u pokazivač drugog tipa podataka. Ne provjerava jesu li tipovi podataka pokazivača isti ili ne. Ovaj uređaj za lijevanje treba pažljivo koristiti i rukovati njime.

Primjer
U ovoj ilustraciji, pokazivač jedne vrste podataka reinterpretira se u pokazivač druge vrste podataka pomoću reinterpret_cast:

#include
korištenjem imenski prostor std ;

int glavni ( )
{
int * q = novi int ( 70 ) ;
char * CH = reinterpret_cast ( q ) ;
cout << * q << endl ;
cout << * CH << endl ;
cout << q << endl ;
cout << CH << endl ;
povratak 0 ;
}

U početku se cijelom broju dodjeljuje vrijednost 70. Pokazivač q pokazuje na ovaj dinamički dodijeljeni cijeli broj. Reinterpret_cast se koristi za reinterpretaciju pokazivača q kao pokazivača znaka ch, što znači da se memorija izvorno dodijeljena q sada tretira kao da je znak. Pomoću naredbe cout ispisuje vrijednost dodijeljenu q i ch. Budući da se ch tretira kao pokazivač znaka, vratit će vrijednost znaka.

Ispisuje vrijednost usmjerenu na ch pomoću *ch. Međutim, budući da se ch tretira kao pokazivač znaka, ovaj će red interpretirati memoriju kao znak. Ispisuje memorijsku adresu pohranjenu u pokazivaču ch koristeći ch. Ovo je ista memorijska adresa kao q jer je samo reinterpretacija iste memorije.

U početku, cijeli broj pohranjuje 70. Kasnije se ovim manipulira između pokazivača q i pokazivača ch. Izlazi 2 i 4 su isti jer se druga vrijednost reinterpretira pomoću reinterpret_cast.

Bilješka : Predlaže se da se ovaj operator cast ne koristi sve dok i osim ako je prijeko potreban jer objekt čini neprenosivim proizvodom

Zaključak

Proces promjene tipa podataka jedne varijable u drugu poznat je kao pretvorba tipa ili pretvaranje tipa u C++. Ovo se radi kako bi se izvršile matematičke operacije na varijablama različitih tipova podataka, čineći njihove tipove podataka međusobno kompatibilnim. Pretvorba tipa optimizira kod. Postoje implicitne i eksplicitne konverzije tipa u C++. Implicitnu konverziju tipa provodi sam kompilator pomoću unaprijed definiranog skupa pravila, dok eksplicitnu konverziju tipa provodi programer koristeći operatore dodjele i operatore pretvaranja.