Type Casting i C: Implisitt og eksplisitt konvertering

⚡ Smart oppsummering

Type-casting i C konverterer én datatype til en annen, enten implisitt når kompilatoren automatisk promoterer en mindre kompatibel type, eller eksplisitt når en programmerer tvinger frem konvertering med en cast-operator for å kontrollere presisjon og forhindre uventede resultater.

  • 🔄 To former: Implisitt casting kjører automatisk; eksplisitt casting skrives med en cast-operator.
  • ⬆️ Type kampanje: Hvis du konverterer en mindre type til en større kompatibel type, som short to int, beholder du verdien.
  • ✂️ Risiko for datatap: Å begrense antall variabeltyper, som for eksempel flyt til heltall, fjerner brøken og mister betydningen.
  • 🎯 Eksplisitt syntaks: Å skrive (typenavn)-uttrykk tvinger frem en konvertering, som å sette heltallsoperander i flyteposisjon.
  • 🤖 AI-hjelp: AI-assistenter og GitHub Copilot utkaster cast-uttrykk og flagger risikable innsnevringskonverteringer.

Skriv støping i C

Hva er Typecasting i C?

Typecasting er å konvertere en datatype til en annen. Det kalles også som datakonvertering eller typekonvertering på C-språk. Det er et av de viktige konseptene som introduseres i 'C'-programmering.

'C'-programmering gir to typer støpeoperasjoner:

  • Implisitt type støping
  • Eksplisitt type casting

Implisitt type støping

Implisitt typecasting betyr konvertering av datatyper uten å miste den opprinnelige betydningen. Denne typen typecasting er viktig når du vil endre datatyper uten å endre betydningen av verdiene som er lagret i variabel.

Implisitt typekonvertering i C skjer automatisk når en verdi kopieres til dens kompatible datatype. Under konvertering er det strenge regler for typekonvertering. Hvis operandene er av to forskjellige datatyper, blir en operand med lavere datatype automatisk konvertert til en høyere datatype. Denne typen typekonvertering kan sees i følgende eksempel.

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

Utgang:

10
10

Implisitt type støping

  1. I det gitte eksemplet har vi erklært en variabel av kort datatype med verdi initialisert som 10.
  2. På den andre linjen har vi deklarert en variabel av en int-datatype.
  3. På den tredje linjen har vi tilordnet verdien av variabel s til variabelen a. På tredje linje utføres implisitt typekonvertering ettersom verdien fra variabel s som er av kort datatype kopieres inn i variabelen a som er av en int datatype.

Konvertering av tegn til Int

Tenk på eksemplet med å legge til et tegn dekodet i ASCII med et heltall:

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

Utgang:

 Value of sum : 108

Her har kompilatoren gjort en heltallskampanje ved å konvertere verdien av 'k' til ASCII før du utfører selve addisjonsoperasjonen.

Aritmetisk konverteringshierarki

Kompilatoren fortsetter først med å promotere en karakter til et heltall. Hvis operandene fortsatt har forskjellige datatyper, blir de konvertert til den høyeste datatypen som vises i følgende hierarkidiagram:

Aritmetisk konverteringshierarki

Tenk på følgende eksempel for å forstå konseptet:

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

Utgang:

 sum = 120.000000

Først av alt blir c-variabelen konvertert til heltall, men kompilatoren konverterer num og c til «float» og legger dem sammen for å produsere et «float»-resultat.

Viktige punkter om implisitte konverteringer

  • Implisitt type type konvertering kalles også som standard type konvertering. Vi krever ingen nøkkelord eller spesielle utsagn i implisitt type casting.
  • Konvertering fra en mindre datatype til en større datatype kalles også typepromotering. I eksemplet ovenfor kan vi også si at verdien av s forfremmes til et heltall.
  • Den implisitte typekonverteringen skjer alltid med de kompatible datatypene.

Vi kan ikke utføre implisitt typekasting på datatypene som ikke er kompatible med hverandre, for eksempel:

  1. Konvertering av float til en int vil avkorte brøkdelen og dermed miste betydningen av verdien.
  2. Konvertering av dobbel til flytende vil runde opp sifrene.
  3. Konvertering av long int til int vil føre til tapping av overskytende biter av høy orden.

I alle tilfellene ovenfor, når vi konverterer datatypene, vil verdien miste sin betydning. Generelt advares kompilatoren om tap av betydning av verdien.

'C' programmering gir en annen måte for typecasting som er eksplisitt typecasting.

Eksplisitt type casting

Ved implisitt typekonvertering konverteres datatypen automatisk. Det er noen scenarier der vi kanskje må tvinge typekonvertering. Anta at vi har en variabel div som lagrer delingen av to operander som er deklarert som en int-datatype.

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

I dette tilfellet, etter delingen utført på variablene var1 og var2, vil resultatet som er lagret i variabelen "resultat" være i et heltallsformat. Når dette skjer, mister verdien som er lagret i variabelen "resultat" sin betydning fordi den ikke tar hensyn til brøkdelen som normalt oppnås ved deling av to tall.

For å tvinge frem typekonverteringen i slike situasjoner bruker vi eksplisitt typeavstøpning.

Det krever en type støpeoperatør. Den generelle syntaksen for type casting-operasjoner er som følger:

(type-name) expression

Her

  • Typenavnet er standard 'C'-språkdatatypen.
  • Et uttrykk kan være en konstant, en variabel eller et faktisk uttrykk.

La oss skrive et program for å demonstrere hvordan man typecaster i C med eksplisitt typecasting.

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

Utgang:

Value of a is 1.200000
Value of b is 2

Eksplisitt type casting

  1. Vi har initialisert en variabel 'a' av typen float.
  2. Deretter har vi en annen variabel, «b», av heltallsdatatypen. Siden variablene «a» og «b» er av forskjellige datatyper, vil ikke «C» tillate bruk av et slikt uttrykk, og det vil gi en feil. I noen versjoner av «C» vil uttrykket bli evaluert, men resultatet vil ikke være ønsket.
  3. For å unngå slike situasjoner har vi typecastet variabelen 'a' av typen float. Ved å bruke eksplisitte type casting-metoder har vi konvertert float til datatype heltall.
  4. Vi har skrevet ut verdien av 'a' som fortsatt er en flyte
  5. Etter typecasting vil resultatet alltid være et heltall 'b.'

På denne måten kan vi implementere eksplisitt type casting i C-programmering.

Spørsmål og svar

Typekonvertering er kompilatorens automatiske endring; typekonvertering er den eksplisitte endringen du ber om med en cast-operator. Casting er én form for konvertering.

Det kan det. Flytende til int avkorter brøken, dobbel flytende avrunder sifre, og lang til int fjerner biter av høyere orden. Utvidende avkastninger forblir trygge.

Ja. C lar deg omforme én pekertype til en annen, og objektpekere konverterer til void* og tilbake. Å fjerne referansen til en inkompatibel omformet peker forårsaker udefinert oppførsel.

C har bare C-stil (type)verdi-casten. C++ legger til fire tryggere navngitte rollebesetninger – static_cast, dynamic_cast, const_cast og reinterpret_cast – med tydeligere, kompilatorsjekket intensjon.

Verdien beholder bare sine lavordensbiter. Hvis den er for stor, vil resultatet brytes eller endre fortegn, så sjekk at den passer inn i målområdet først.

Foretrekk utvidede konverteringer, bekreft at en verdi passer før innsnevring, og konverter én operand til flyt før heltallsdivisjon. Aktiver kompilatoradvarsler for å flagge risikable konverteringer.

Ja. En AI-assistent skriver casteuttrykk fra en ledetekst, forklarer forfremmelsesregler og advarer når en konvertering kan miste data. Kompiler og test alltid resultatet.

GitHub Copilot foreslår implisitte og eksplisitte cast-uttrykk fra en kommentar, inkludert (typenavn)-syntaksen. RevSe hvert forslag for mulig datatap før du kompilerer.

Oppsummer dette innlegget med: