Típusátalakítás C-ben: Implicit és explicit konverzió

⚡ Okos összefoglaló

A C nyelvben a típusátalakítás egy adattípust egy másikba konvertál, akár implicit módon, amikor a fordító automatikusan egy kisebb, kompatibilis típust támogat, akár explicit módon, amikor a programozó egy típusátalakítási operátorral kényszeríti ki az átalakítást a pontosság szabályozása és a váratlan eredmények elkerülése érdekében.

  • 🔄 Két forma: Az implicit casting automatikusan lefut; az explicit casting egy cast operátorral íródik.
  • ⬆️ Típus promóció: Egy kisebb típus nagyobb, kompatibilis típusra konvertálása, például a short int típusra konvertálása, megtartja az értéket.
  • ✂️ Adatvesztés kockázata: A szűkítő konverziók, mint például a float az int-hez, elvetik a törtet és elveszítik a jelentésüket.
  • 🎯 Explicit szintaxis: A (típus-név) kifejezés írása konverziót kényszerít ki, például egész operandusok lebegőpontossá konvertálását.
  • 🤖 AI segítség: A mesterséges intelligencia asszisztensei és a GitHub Copilot áltípus-kifejezéseket készítenek, és kockázatos szűkítő konverziókat jelölnek.

C típusú öntvény

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átalakítás az adattípusok eredeti jelentésük elvesztése nélküli átalakítását jelenti. Ez a fajta típusátalakítás elengedhetetlen, ha az adattípusokat a bennük tárolt értékek jelentőségének megváltoztatása nélkül szeretnénk módosítani. 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

Implicit típusú öntés

  1. Az adott példában egy rövid adattípusú változót deklaráltunk, amelynek értéke 10.
  2. A második sorban egy int adattípusú változót deklaráltunk.
  3. 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:

Aritmetikai átváltási hierarchia

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ó egész számmá alakul, de a fordító a num és a c változókat „float”-os számmá alakítja, és összeadja őket, hogy „float” eredményt kapjon.

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ípusú adattípusú adattípusú adattípusú adattípus átalakítását típuselőléptetésnek is nevezzük. A fenti példában azt is mondhatjuk, hogy az s értékét egész szám típusra léptetjük elő.
  • 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:

  1. A float int-re átalakítása csonkolja a tört részt, így elveszíti az érték jelentését.
  2. A dupla lebegővé alakítása felfelé kerekíti a számjegyeket.
  3. A long int szám int számmá konvertálása értékcsökkenést okozping a felesleges magas rendű bitekből.

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

Explicit típusú öntvény

  1. Inicializáltunk egy float típusú 'a' változót.
  2. Következőként van egy másik változónk, a 'b', amely egész adattípusú. Mivel az 'a' és a 'b' változók különböző adattípusúak, a 'C' nyelv nem engedélyezi az ilyen kifejezés használatát, és hibát okoz. A 'C' egyes verzióiban a kifejezés kiértékelődik, de az eredmény nem lesz kívánt.
  3. 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á.
  4. Kinyomtattuk az „a” értéket, ami még mindig lebegő
  5. 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.

GYIK

A típuskonverzió a fordító automatikus módosítása; a típusátalakítás az a explicit módosítás, amelyet egy típusátalakító operátorral kérünk. A típusátalakítás a konverzió egyik formája.

Megteheti. A float = int csonkolja a törtet, a double = float kerekíti a számjegyeket, a long = int pedig elveti a magasabb helyiértékű biteket. A kiszélesítő átírások biztonságosak maradnak.

Igen. A C nyelvben egyik mutatótípust egy másikra konvertálhatjuk, az objektummutatókat pedig void*-ra és vissza. Egy inkompatibilisen konvertált mutató dereferenciája nem definiált viselkedést okoz.

A C nyelv csak a C stílusú (típus)érték konverzióval rendelkezik. C++ négy biztonságosabb, elnevezett konverziót ad hozzá – static_cast, dynamic_cast, const_cast és reinterpret_cast – egyértelműbb, fordító által ellenőrzött szándékkal.

Az érték csak az alsó helyiértékű biteket őrzi meg. Ha túl nagy, az eredmény tördelődik vagy előjelet vált, ezért először ellenőrizd, hogy illeszkedik-e a céltartományba.

Szélesítő konverziók előnyben részesítése, értékillesztések megerősítése szűkítés előtt, és egy operandus lebegőpontossá konvertálása egész osztás előtt. Fordítói figyelmeztetések engedélyezése a kockázatos konverziók jelzésére.

Igen. Egy mesterséges intelligencia asszisztens egy promptból írja ki a konverziós kifejezéseket, elmagyarázza az előléptetési szabályokat, és figyelmeztet, ha egy konverzió adatvesztést okozhat. Mindig fordítsa le és tesztelje az eredményt.

GitHub másodpilóta implicit és explicit konvertálási kifejezéseket javasol egy megjegyzésből, beleértve a (típus-név) szintaxist is. RevFordítás előtt tekintse át az összes javaslatot az esetleges adatvesztéssel kapcsolatban.

Foglald össze ezt a bejegyzést a következőképpen: