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: