Tyypinmuunnos C:ssä: implisiittinen ja eksplisiittinen muunnos

⚡ Älykäs yhteenveto

C-kielen tyypinmuunnos muuntaa yhden tietotyypin toiseksi joko implisiittisesti, kun kääntäjä mainostaa automaattisesti pienempää yhteensopivaa tyyppiä, tai eksplisiittisesti, kun ohjelmoija pakottaa muunnoksen tyypinmuunnosoperaattorilla tarkkuuden hallitsemiseksi ja odottamattomien tulosten estämiseksi.

  • 🔄 Kaksi muotoa: Implisiittinen koodaus suoritetaan automaattisesti; eksplisiittinen koodaus kirjoitetaan koodausoperaattorilla.
  • ⬆️ Tyyppikampanja: Pienemmän tyypin muuntaminen suuremmaksi ja yhteensopivaksi, kuten short-tyypin muuntaminen int-tyypiksi, säilyttää arvon.
  • ✂️ Tietojen menetyksen riski: Kapenevat muunnokset, kuten float ja int, pudottavat murtoluvun ja menettävät merkityksensä.
  • 🎯 Eksplisiittinen syntaksi: Lausekkeen (tyyppi-nimi) kirjoittaminen pakottaa muunnoksen, kuten kokonaislukuoperandin muuntamisen liukulukuisiksi.
  • 🤖 AI-apu: Tekoälyavustajat ja GitHub Copilot luonnostelevat muuntolausekkeita ja merkitsevät riskialttiita kaventavia konversioita.

Tyyppivalu C-muodossa

Mitä Typecasting on C:ssä?

Typecasting on tietotyypin muuntamista toiseksi. Sitä kutsutaan myös datamuunnokseksi tai tyyppimuunnokseksi C-kielellä. Se on yksi tärkeimmistä C-ohjelmoinnin käsitteistä.

"C"-ohjelmointi tarjoaa kahdentyyppisiä valutoimintoja:

  • Epäsuora tyypin suoratoisto
  • Eksplisiittisen tyypin casting

Epäsuora tyypin suoratoisto

Implisiittinen tyyppimuunnos tarkoittaa tietotyyppien muuntamista menettämättä niiden alkuperäistä merkitystä. Tämän tyyppinen tyyppimuunnos on välttämätön, kun haluat muuttaa tietotyyppejä muuttamatta tyypin sisällä tallennettujen arvojen merkitystä. muuttuja.

Implisiittisen tyypin muunnos C:ssä tapahtuu automaattisesti, kun arvo kopioidaan sen yhteensopivaan tietotyyppiin. Muuntamisen aikana sovelletaan tiukkoja tyyppimuunnossääntöjä. Jos operandit ovat kahta eri tietotyyppiä, niin operandi, jolla on pienempi tietotyyppi, muunnetaan automaattisesti korkeammaksi tietotyypiksi. Tämän tyyppinen muunnos näkyy seuraavassa esimerkissä.

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

lähtö:

10
10

Epäsuora tyypin suoratoisto

  1. Annetussa esimerkissä olemme ilmoittaneet lyhyen tietotyypin muuttujan, jonka arvo on alustettu 10:ksi.
  2. Toisella rivillä olemme ilmoittaneet int-tietotyypin muuttujan.
  3. Kolmannella rivillä olemme määrittäneet muuttujan s arvon muuttujalle a. Kolmannella rivillä implisiittisen tyypin muunnos suoritetaan, kun lyhytdatatyyppisen muuttujan s arvo kopioidaan muuttujaan a, joka on int-datatyyppiä.

Muunnetaan merkki Int

Harkitse esimerkkiä ASCII-koodatun merkin lisäämisestä kokonaisluvulla:

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

lähtö:

 Value of sum : 108

Tässä kääntäjä on tehnyt kokonaislukupromotion muuntamalla 'k':n arvon ASCII:ksi ennen varsinaisen summausoperaation suorittamista.

Aritmeettinen muunnoshierarkia

Kääntäjä etenee ensin merkin ylentämiseksi kokonaisluvuksi. Jos operandeissa on edelleen erilaisia ​​tietotyyppejä, ne muunnetaan korkeimmaksi tietotyypiksi, joka näkyy seuraavassa hierarkiakaaviossa:

Aritmeettinen muunnoshierarkia

Harkitse seuraavaa esimerkkiä ymmärtääksesi käsitteen:

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

lähtö:

 sum = 120.000000

Ensinnäkin c-muuttuja muunnetaan kokonaisluvuksi, mutta kääntäjä muuntaa num- ja c-muuttujat "float"-luvuiksi ja laskee ne yhteen tuottaakseen 'float'-tuloksen.

Tärkeitä seikkoja implisiittisistä konversioista

  • Implisiittistä tyyppimuunnostyyppiä kutsutaan myös vakiotyyppimuunnokseksi. Emme vaadi avainsanoja tai erityislauseita implisiittisessä tyyppivalussa.
  • Pienemmän tietotyypin muuntamista suuremmaksi kutsutaan myös tyypin edistämiseksi. Yllä olevassa esimerkissä voimme myös sanoa, että s:n arvoa ylennetään tyypiksi kokonaisluku.
  • Implisiittinen tyyppimuunnos tapahtuu aina yhteensopivien tietotyyppien kanssa.

Emme voi suorittaa implisiittistä tyyppisuoraa tietotyypeille, jotka eivät ole yhteensopivia keskenään, kuten:

  1. Floatin muuntaminen int:ksi katkaisee murto-osan, mikä menettää arvon merkityksen.
  2. Tuplauksen muuntaminen kelluvaksi pyöristää luvut ylöspäin.
  3. Pitkän kokonaislukumäärän muuntaminen kokonaislukumääräksi aiheuttaa virheenping ylimääräisistä korkeamman asteen biteistä.

Kaikissa yllä olevissa tapauksissa, kun muunnamme tietotyypit, arvo menettää merkityksensä. Yleensä kääntäjä varoittaa arvon merkityksen menettämisestä.

"C" ohjelmointi tarjoaa toisen tavan typecastingille, joka on eksplisiittinen tyyppivalu.

Eksplisiittisen tyypin casting

Implisiittisessä tyyppimuunnoksessa tietotyyppi muunnetaan automaattisesti. Joissakin tilanteissa saatamme joutua pakottamaan tyyppimuunnoksen. Oletetaan, että meillä on muuttuja div, joka tallentaa kahden operandin jaon, jotka on ilmoitettu int-tietotyypiksi.

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

Tässä tapauksessa muuttujille var1 ja var2 tehdyn jaon jälkeen muuttujaan “result” tallennettu tulos on kokonaislukumuodossa. Aina kun näin tapahtuu, muuttujaan ”result” tallennettu arvo menettää merkityksensä, koska se ei ota huomioon murto-osaa, joka tavallisesti saadaan jaettaessa kahta lukua.

Pakottaaksemme tyyppimuunnoksen tällaisissa tilanteissa käytämme eksplisiittistä tyyppivalua.

Se vaatii tyyppivaluoperaattorin. Tyyppivalutoimintojen yleinen syntaksi on seuraava:

(type-name) expression

Täällä

  • Tyypin nimi on standardi C-kielen tietotyyppi.
  • Lauseke voi olla vakio, muuttuja tai todellinen lauseke.

Kirjoitetaan ohjelma, joka havainnollistaa, kuinka C:ssä kirjoitetaan eksplisiittisellä type-castingilla.

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

lähtö:

Value of a is 1.200000
Value of b is 2

Eksplisiittisen tyypin casting

  1. Olemme alustaneet float-tyypin muuttujan 'a'.
  2. Seuraavaksi meillä on toinen muuttuja 'b', jonka tietotyyppi on kokonaisluku. Koska muuttujat 'a' ja 'b' ovat eri tietotyyppiä, 'C' ei salli tällaisen lausekkeen käyttöä ja se aiheuttaa virheen. Joissakin 'C':n versioissa lauseke lasketaan, mutta tulosta ei haluta.
  3. Tällaisten tilanteiden välttämiseksi olemme kirjoittaneet float-tyypin muuttujan "a". Explicit type casting -menetelmiä käyttämällä olemme onnistuneesti muuntaneet floatin tietotyypin kokonaisluvuiksi.
  4. Meillä on painettu arvo "a", joka on edelleen kelluva
  5. Tyyppilähetyksen jälkeen tulos on aina kokonaisluku 'b'.

Tällä tavalla voimme toteuttaa eksplisiittisen tyyppivalun C-ohjelmoinnissa.

UKK

Tyyppimuunnos on kääntäjän automaattinen muutos; tyypinmuunnos on nimenomainen muutos, jota pyydät tyypinmuunnosoperaattorilla. Tyypinmuunnos on yksi muunnoksen muoto.

Se voi. Float-funktion muuttaminen kokonaisluvuksi katkaisee murtoluvun, double-funktion muuttaminen liukulukufunktioksi pyöristää numeroita ja long-funktion muuttaminen kokonaisluvuksi poistaa korkeamman kertaluvun bitit. Levennysmuunnokset pysyvät turvallisina.

Kyllä. C:ssä voit muuntaa yhden osoittimen tyypin toiseksi, ja olio-osoittimet muunnetaan void*-tyypeiksi ja päinvastoin. Yhteensopimattomassa muodossa olevan osoittimen viittauksen poistaminen aiheuttaa määrittelemätöntä toimintaa.

C:llä on vain C-tyylinen (tyyppi)arvomuunnos. C++ lisää neljä turvallisempaa nimettyä muunnostapaa – static_cast, dynamic_cast, const_cast ja reinterpret_cast – selkeämmällä, kääntäjän tarkistamalla tarkoituksella.

Arvo säilyttää vain pienimmän kertaluvun bittinsä. Jos se on liian suuri, tulos rivittyy tai vaihtaa etumerkkiä, joten tarkista ensin, että se sopii kohdealueelle.

Suosi leventäviä muunnoksia, varmista arvon sopivuus ennen kaventamista ja muunna yksi operandi liukulukuksi ennen kokonaislukujakoa. Ota käyttöön kääntäjän varoitukset riskialttiiden muunnosten merkitsemiseksi.

Kyllä. Tekoälyavustaja kirjoittaa kehotteesta muuntolausekkeita, selittää ylennyssäännöt ja varoittaa, kun muunnos saattaa menettää tietoja. Käännä ja testaa tulos aina.

GitHub Copilot ehdottaa implisiittisiä ja eksplisiittisiä muunnoslausekkeita kommentista, mukaan lukien (tyypin-nimen) syntaksi. RevTarkista jokainen ehdotus mahdollisen tietojen menetyksen varalta ennen kääntämistä.

Tiivistä tämä viesti seuraavasti: