Type Casting in C: Type Conversion, Implicit, Explicit with example
Mi az a Typecasting C-ben?
A Typecasting az egyik adattípust egy másikra konvertál. C nyelvben adatkonverziónak vagy típuskonverziónak is nevezik. Ez a „C” programozás egyik fontos fogalma.
A „C” programozás kétféle típusú öntési műveletet biztosít:
- Implicit típusú öntés
- Explicit típusú öntvény
Implicit típusú öntés
Az implicit típusöntés az adattípusok átalakítását jelenti anélkül, hogy elveszítené eredeti jelentését. Ez a fajta typecasting elengedhetetlen az adattípusok megváltoztatásához nélkül belül tárolt értékek jelentőségének megváltoztatása változó.
Az implicit típuskonverzió a C-ben automatikusan megtörténik, amikor egy értéket a kompatibilis adattípusba másol. Az átalakítás során szigorú típusátalakítási szabályok érvényesek. Ha az operandusok két különböző adattípusúak, akkor egy alacsonyabb adattípusú operandus automatikusan magasabb adattípussá alakul. Ez a típusú átalakítás a következő példában látható.
#include<stdio.h> int main(){ short a=10; //initializing variable of short data type int b; //declaring int variable b=a; //implicit type casting printf("%d\n",a); printf("%d\n",b); }
output:
10 10
- Az adott példában egy rövid adattípusú változót deklaráltunk, amelynek értéke 10.
- A második sorban egy int adattípusú változót deklaráltunk.
- A harmadik sorban az s változó értékét az a változóhoz rendeltük. A harmadik sorban az implicit típusú konverziót úgy hajtják végre, hogy a rövid adattípusú s változó értékét az a változóba másolják, amely int adattípusú.
Karakter konvertálása Int
Tekintsük a példát egy ASCII-ben dekódolt karakter hozzáadására egész számmal:
#include <stdio.h> main() { int number = 1; char character = 'k'; /*ASCII value is 107 */ int sum; sum = number + character; printf("Value of sum : %d\n", sum ); }
output:
Value of sum : 108
Itt a fordító egy egész számot hajtott végre úgy, hogy a tényleges összeadási művelet végrehajtása előtt a „k” értékét ASCII-re konvertálta.
Aritmetikai átváltási hierarchia
A fordító először egy karaktert egész számmá emel. Ha az operandusok továbbra is eltérő adattípusokkal rendelkeznek, akkor a rendszer a következő hierarchiadiagramban megjelenő legmagasabb adattípusra konvertálja őket:
A fogalom megértéséhez vegye figyelembe a következő példát:
#include <stdio.h> main() { int num = 13; char c = 'k'; /* ASCII value is 107 */ float sum; sum = num + c; printf("sum = %f\n", sum );}
output:
sum = 120.000000
Először is a c változót egész számmá alakítjuk, de a fordító konvertálja num és a c „float”-ba, és hozzáadja őket „lebegő” eredmény eléréséhez.
Fontos tudnivalók az implicit konverziókkal kapcsolatban
- Az implicit típusú típuskonverziót szabványos típuskonverziónak is nevezik. Az implicit típusöntéshez nincs szükségünk kulcsszavakra vagy speciális kijelentésekre.
- A kisebb adattípusból nagyobb adattípusba való konvertálást ún típusú promóció. A fenti példában azt is mondhatjuk, hogy az s értéke integer típusúvá van előléptetve.
- Az implicit típuskonverzió mindig a kompatibilis adattípusokkal történik.
Nem tudunk implicit típusöntést végrehajtani olyan adattípusokon, amelyek nem kompatibilisek egymással, például:
- A float int-re átalakítása csonkolja a tört részt, így elveszíti az érték jelentését.
- A dupla lebegővé alakítása felfelé kerekíti a számjegyeket.
- A long int int-re konvertálása a felesleges magas rendű bitek kiesését okozza.
A fenti esetekben az adattípusok konvertálásakor az érték elveszti értelmét. Általában az érték jelentésének elvesztésére a fordító figyelmeztet.
'C' programozás egy másik módot kínál a típusöntésre, amely az explicit típusú öntvény.
Explicit típusú öntvény
Az implicit típuskonverzió során az adattípus automatikusan konvertálódik. Vannak olyan forgatókönyvek, amelyekben előfordulhat, hogy ki kell kényszeríteni a típusátalakítást. Tegyük fel, hogy van egy div változónk, amely két int adattípusként deklarált operandus felosztását tárolja.
int result, var1=10, var2=3; result=var1/var2;
Ebben az esetben a var1 és var2 változókon végzett osztás után az „eredmény” változóban tárolt eredmény egész szám formátumú lesz. Amikor ez megtörténik, az „eredmény” változóban tárolt érték elveszti értelmét, mert nem veszi figyelembe azt a tört részt, amelyet általában két szám osztásakor kapunk.
A típuskonverzió kikényszerítésére ilyen helyzetekben explicit típusöntést használunk.
Ehhez típusöntő operátor szükséges. A típusöntési műveletek általános szintaxisa a következő:
(type-name) expression
Itt,
- A típusnév a szabványos „C” nyelvi adattípus.
- Egy kifejezés lehet konstans, változó vagy tényleges kifejezés.
Írjunk egy programot, amely bemutatja, hogyan lehet C-ben explicit típus-öntéssel szöveget adni.
#include<stdio.h> int main() { float a = 1.2; //int b = a; //Compiler will throw an error for this int b = (int)a + 1; printf("Value of a is %f\n", a); printf("Value of b is %d\n",b); return 0; }
output:
Value of a is 1.200000 Value of b is 2
- Inicializáltunk egy float típusú 'a' változót.
- Ezután egy másik, egész adattípusú 'b' változónk van. Mivel az 'a' és 'b' változók különböző adattípusúak, a 'C' nem teszi lehetővé az ilyen kifejezések használatát, és hibát okoz. A 'C' egyes verzióiban a kifejezés kiértékelődik, de az eredmény nem kívánatos.
- Az ilyen helyzetek elkerülése érdekében a float típusú 'a' változót typecast-ként írtuk le. Explicit típusú öntési módszerek használatával sikeresen konvertáltuk a float adattípusú egész számmá.
- Kinyomtattuk az „a” értéket, ami még mindig lebegő
- A gépelés után az eredmény mindig egy 'b' egész szám lesz.
Ily módon explicit típusú öntést valósíthatunk meg a C programozásban.
Összegzésként
- A típusadást típuskonverziónak is nevezik
- Ez azt jelenti, hogy az egyik adattípust egy másikra kell konvertálni.
- A kisebb adattípusok nagyobbá alakítását típuspromóciónak is nevezik.
- A típuskonverziónak két típusa van: implicit és explicit típuskonverzió C-ben.
- Az implicit típuskonverzió automatikusan működik, ha a rendszer megtalálja a kompatibilis adattípust.
- Az explicit típuskonverzióhoz típusöntési operátor szükséges.
Tartsa szem előtt a következő szabályokat a programozási gyakorlat során, amikor különböző adattípusokkal foglalkozik, hogy elkerülje az adatvesztést:
- Az egész típusokat lebegővé kell konvertálni.
- Az úszó típusokat át kell alakítani duplává.
- A karaktertípusokat egész számokká kell konvertálni.