Pretvaranje tipova u C: Implicitna i eksplicitna konverzija

⚡ Pametni sažetak

Pretvaranje tipova u C-u pretvara jedan tip podataka u drugi, bilo implicitno kada kompajler automatski promovira manji kompatibilni tip ili eksplicitno kada programer prisiljava pretvorbu pomoću operatora pretvaranja kako bi kontrolirao preciznost i spriječio neočekivane rezultate.

  • 🔄 Dva oblika: Implicitno pretvaranje se izvršava automatski; eksplicitno pretvaranje se piše pomoću operatora pretvaranja.
  • ⬆️ Vrsta promocije: Pretvaranje manjeg tipa u veći kompatibilni, poput short u int, zadržava vrijednost.
  • ✂️ Rizik od gubitka podataka: Sužavanje pretvaranja kao što je float u int odbacuje razlomak i gubi smisao.
  • 🎯 Eksplicitna sintaksa: Pisanje izraza (naziv-tipa) prisiljava pretvorbu, poput pretvaranja cijelih operanada u brojeve s pomičnim snopom.
  • 🤖 AI pomoć: AI asistenti i GitHub Copilot izrađuju izraze za pretvorbu i označavaju rizične konverzije sužavanja.

Pretvaranje tipova u C

Što je Typecasting u C-u?

Typecasting je pretvaranje jedne vrste podataka u drugu. Također se naziva pretvorba podataka ili pretvorba tipa u C jeziku. To je jedan od važnih koncepata uvedenih u 'C' programiranje.

'C' programiranje pruža dvije vrste operacija pretvaranja tipa:

  • Implicitno pretvaranje tipa
  • Eksplicitno lijevanje tipa

Implicitno pretvaranje tipa

Implicitno pretvaranje tipova podataka znači pretvorbu tipova podataka bez gubitka izvornog značenja. Ova vrsta pretvarjanja tipova podataka je bitna kada želite promijeniti tipove podataka bez promjene značajnosti vrijednosti pohranjenih unutar varijabla.

Implicitna pretvorba tipa u C događa se automatski kada se vrijednost kopira u svoj kompatibilni tip podataka. Tijekom konverzije primjenjuju se stroga pravila za konverziju tipa. Ako su operandi dva različita tipa podataka, tada se operand s nižim tipom podataka automatski pretvara u viši tip podataka. Ovaj tip pretvorbe tipa može se vidjeti u sljedećem primjeru.

#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);
}

Izlaz:

10
10

Implicitno pretvaranje tipa

  1. U navedenom primjeru smo deklarirali varijablu kratkog tipa podataka s vrijednošću inicijaliziranom kao 10.
  2. U drugom retku smo deklarirali varijablu int tipa podataka.
  3. U trećem retku smo varijabli a dodijelili vrijednost varijable s. U trećem retku izvodi se implicitna konverzija tipa jer se vrijednost iz varijable s koja je tipa short kopira u varijablu a koja je tipa int.

Pretvaranje znaka u Int

Razmotrite primjer dodavanja znaka dekodiranog u ASCII s cijelim brojem:

#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 );
}

Izlaz:

 Value of sum : 108

Ovdje je prevodilac napravio cjelobrojnu promociju pretvaranjem vrijednosti 'k' u ASCII prije izvođenja stvarne operacije zbrajanja.

Hijerarhija aritmetičke pretvorbe

Prevodilac prvo nastavlja s promicanjem znaka u cijeli broj. Ako operandi i dalje imaju različite vrste podataka, tada se pretvaraju u najvišu vrstu podataka koja se pojavljuje u sljedećem hijerarhijskom grafikonu:

Hijerarhija aritmetičke pretvorbe

Razmotrite sljedeći primjer da biste razumjeli koncept:

#include <stdio.h>
main() {
   int  num = 13;
   char c = 'k'; /* ASCII value is 107 */
   float sum;
   sum = num + c;
   printf("sum = %f\n", sum );}

Izlaz:

 sum = 120.000000

Prvo, varijabla c se pretvara u cijeli broj, ali kompajler pretvara num i c u "float" i zbraja ih kako bi dobio rezultat 'float'.

Važne točke o implicitnim konverzijama

  • Implicitna vrsta pretvorbe tipa također se naziva i standardna pretvorba tipa. Ne zahtijevamo nikakve ključne riječi ili posebne izjave u implicitnom pretvaranju tipa.
  • Pretvaranje iz manjeg tipa podataka u veći tip podataka naziva se i promocija tipa. U gornjem primjeru možemo reći i da se vrijednost s promoviše u cijeli broj tipa.
  • Implicitna konverzija tipa uvijek se događa s kompatibilnim tipovima podataka.

Ne možemo izvršiti implicitno pretvaranje tipa na tipove podataka koji nisu međusobno kompatibilni kao što su:

  1. Pretvaranje float u int će skratiti dio razlomka čime će se izgubiti značenje vrijednosti.
  2. Pretvaranjem double u float zaokružit ćete znamenke.
  3. Pretvaranje dugog cijelog broja u cijelo će uzrokovati padping viška bitova visokog reda.

U svim gore navedenim slučajevima, kada pretvorimo tipove podataka, vrijednost će izgubiti svoje značenje. Općenito, prevodilac upozorava na gubitak značenja vrijednosti.

'C' programiranje pruža još jedan način pretvaranja tipa koji je eksplicitno pretvaranje tipa.

Eksplicitno lijevanje tipa

U implicitnoj pretvorbi tipa, vrsta podataka se automatski pretvara. Postoje neki scenariji u kojima ćemo možda morati forsirati konverziju tipa. Pretpostavimo da imamo varijablu div koja pohranjuje dijeljenje dvaju operanda koji su deklarirani kao int tip podataka.

 int result, var1=10, var2=3;
result=var1/var2;

U ovom slučaju, nakon dijeljenja izvršenog na varijablama var1 i var2, rezultat pohranjen u varijabli "rezultat" bit će u obliku cijelog broja. Kad god se to dogodi, vrijednost pohranjena u varijabli "rezultat" gubi svoje značenje jer ne uzima u obzir razlomak koji se inače dobiva dijeljenjem dvaju brojeva.

Da bismo prisilili pretvorbu tipa u takvim situacijama, koristimo eksplicitno pretvaranje tipa.

Zahtijeva operatora za pretvaranje tipa. Opća sintaksa za operacije pretvaranja tipa je sljedeća:

(type-name) expression

Ovdje,

  • Naziv tipa je standardni tip podataka jezika 'C'.
  • Izraz može biti konstanta, varijabla ili stvarni izraz.

Napišimo program koji će pokazati kako tipizirati u C s eksplicitnim tipiziranjem.

#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;
}

Izlaz:

Value of a is 1.200000
Value of b is 2

Eksplicitno lijevanje tipa

  1. Inicijalizirali smo varijablu 'a' tipa float.
  2. Zatim imamo još jednu varijablu 'b' cjelobrojnog tipa podataka. Budući da su varijable 'a' i 'b' različitih tipova podataka, 'C' neće dopustiti korištenje takvog izraza i to će izazvati grešku. U nekim verzijama 'C' izraz će biti vrednovan, ali rezultat neće biti željeni.
  3. Kako bismo izbjegli takve situacije, tipizirali smo varijablu 'a' tipa float. Korištenjem eksplicitnih metoda pretvaranja tipa, uspješno smo pretvorili float u podatkovni tip integer.
  4. Ispisali smo vrijednost 'a' koja je još uvijek float
  5. Nakon tipiziranja, rezultat će uvijek biti cijeli broj 'b.'

Na ovaj način možemo implementirati eksplicitno pretvaranje tipa u C programiranje.

Pitanja i odgovori

Konverzija tipa je automatska promjena koju vrši kompajler; pretvaranje tipa je eksplicitna promjena koju zahtijevate operatorom pretvaranja. Pretvaranje je jedan oblik konverzije.

Može. Float u int skraćuje razlomak, double u float zaokružuje znamenke, a long u int odbacuje bitove višeg reda. Proširivanje pretvaranja ostaje sigurno.

Da. C vam omogućuje pretvaranje jednog tipa pokazivača u drugi, a pokazivači objekata pretvaraju se u void* i natrag. Dereferenciranje nekompatibilno pretvorenog pokazivača uzrokuje nedefinirano ponašanje.

C ima samo pretvaranja vrijednosti (tip) u C stilu. C++ dodaje četiri sigurnija imenovana pretvaranja — static_cast, dynamic_cast, const_cast i reinterpret_cast — s jasnijom, kompajlerom provjerenom namjerom.

Vrijednost zadržava samo bitove nižeg reda. Ako je prevelika, rezultat se prelama ili mijenja predznak, stoga prvo provjerite odgovara li ciljanom rasponu.

Preferirajte proširivanje pretvaranja, provjerite odgovara li vrijednost prije sužavanja i pretvorite jedan operand u broj s pomičnim zarezom prije cjelobrojnog dijeljenja. Omogućite upozorenja kompajlera za označavanje rizičnih pretvorbi.

Da. AI asistent piše izraze za pretvorbu iz prompta, objašnjava pravila promocije i upozorava kada konverzija može izgubiti podatke. Uvijek kompajliraj i testiraj rezultat.

GitHub kopilot predlaže implicitne i eksplicitne izraze pretvaranja iz komentara, uključujući sintaksu (naziv-tipa). RevPrije kompajliranja pregledajte svaki prijedlog zbog mogućeg gubitka podataka.

Sažmite ovu objavu uz: