Mitä kirjoitusvirhe C: ssä on?
Typecasting on yhden tietotyypin muuntaminen toiseksi. Sitä kutsutaan myös datan muunnokseksi tai tyypin muunnokseksi. Se on yksi tärkeimmistä C-ohjelmoinnissa esitetyistä käsitteistä.
C-ohjelmointi tarjoaa kahden tyyppisen tyyppivalun:
- Epäsuora tyypin suoratoisto
- Täsmällinen tyyppivalu
Epäsuora tyypin suoratoisto
Implisiittityypin suoratoisto tarkoittaa tietotyyppien muuntamista menettämättä alkuperäistä merkitystään. Tämäntyyppinen tyypittely on välttämätöntä, kun haluat muuttaa tietotyyppejä ilman muuttamatta merkitystä arvojen tallennettu muuttujan.
Epäsuora tyypin muunnos tapahtuu automaattisesti, kun arvo kopioidaan yhteensopivaan tietotyyppiin. Muunnoksen aikana sovelletaan tiukkoja sääntöjä tyypin muuntamiseen. Jos operandit ovat kahta erilaista tietotyyppiä, operandi, jolla on pienempi tietotyyppi, muunnetaan automaattisesti korkeammaksi tietotyypiksi. Tämän tyyppinen muunnos voidaan nähdä seuraavasta esimerkistä.
#includeint main(){short a=10; //initializing variable of short data typeint b; //declaring int variableb=a; //implicit type castingprintf("%d\n",a);printf("%d\n",b);}
Tuotos
1010
- Annetussa esimerkissä olemme ilmoittaneet lyhyttietoisen muuttujan, jonka arvo on alustettu arvoon 10.
- Toisella rivillä olemme ilmoittaneet int-tietotyyppisen muuttujan.
- Kolmannella rivillä olemme määrittäneet muuttujan s arvon muuttujalle a. Kolmannella rivillä implisiittinen tyypin muunnos suoritetaan, kun muuttujan s, jolla on lyhyt tietotyyppi, arvo kopioidaan muuttujaan a, joka on int-tyyppinen.
Muuntaa merkin Int
Harkitse esimerkkiä ASCII: ssa dekoodatun merkin lisäämisestä kokonaisluvulla:
#includemain() {int number = 1;char character = 'k'; /*ASCII value is 107 */int sum;sum = number + character;printf("Value of sum : %d\n", sum );}
Tuotos:
Value of sum : 108
Täällä kääntäjä on tehnyt kokonaislukumainonnan muuntamalla k: n arvon ASCII: ksi ennen varsinaisen lisäystoiminnon suorittamista.
Aritmeettisen muunnoksen hierarkia
Kääntäjä etenee ensin merkin kokonaisluvuksi. Jos operandeilla on edelleen erilaisia tietotyyppejä, ne muunnetaan korkeimpaan tietotyyppiin, joka näkyy seuraavassa hierarkiakaaviossa:
Harkitse seuraavaa esimerkkiä käsitteen ymmärtämiseksi:
#includemain() {int num = 13;char c = 'k'; /* ASCII value is 107 */float sum;sum = num + c;printf("sum = %f\n", sum );}
Tuotos:
sum = 120.000000
Ensinnäkin c-muuttuja muunnetaan kokonaisluvuksi, mutta kääntäjä muuntaa num ja c "floatiksi" ja lisää ne tuottamaan "float" -tuloksen.
Tärkeitä tietoja implisiittisistä muunnoksista
- Tyyppimuunnoksen implisiittistä tyyppiä kutsutaan myös vakiotyyppimuunnokseksi. Emme vaadi avainsanoja tai erityislausekkeita implisiittisten tyyppien suoratoistossa.
- Muuntamista pienemmästä tietotyypistä suuremmaksi kutsutaan myös tyyppikampanjaksi . Yllä olevassa esimerkissä voimme myös sanoa, että s: n arvo ylennetään kokonaislukuun.
- Epäsuora tyyppimuunnos tapahtuu aina yhteensopivien tietotyyppien kanssa.
Emme voi suorittaa implisiittistä tyyppivalua tietotyypeille, jotka eivät ole keskenään yhteensopivia, kuten:
- Kelluvan muuntaminen int-arvoksi katkaisee murto-osan ja menettää siten arvon merkityksen.
- Kaksinkertaisen muuntaminen kelluvaksi pyöristää numerot ylöspäin.
- Pitkän int-arvon muuntaminen aiheuttaa ylimääräisten korkea-arvoisten bittien pudottamisen.
Kaikissa yllä mainituissa tapauksissa, kun muunnamme tietotyypit, arvo menettää merkityksensä. Yleensä kääntäjä varoittaa arvon merkityksen menetystä.
C-ohjelmointi tarjoaa toisen tyyppikokoelman, joka on nimenomainen tyyppivalu.
Täsmällinen tyyppivalu
Epäsuorassa tyypin muunnoksessa tietotyyppi muunnetaan automaattisesti. On joitain tilanteita, joissa joudumme joutumaan pakottamaan tyyppimuunnos. Oletetaan, että meillä on muuttuja div, joka tallentaa kahden operandin jaon, jotka ilmoitetaan int-tietotyypiksi.
int result, var1=10, var2=3;result=var1/var2;
Tässä tapauksessa muuttujille var1 ja var2 suoritetun jaon jälkeen muuttujaan "result" tallennettu tulos on kokonaislukumuoto. Aina kun näin tapahtuu, muuttujaan "tulos" tallennettu arvo menettää merkityksensä, koska se ei ota huomioon murto-osaa, joka normaalisti saadaan kahden luvun jaossa.
Pakottaaksemme tyyppimuunnoksen tällaisissa tilanteissa käytämme nimenomaista tyyppivalua.
Se vaatii tyypinvaluoperaattorin. Tyypin valuoperaatioiden yleinen syntakse on seuraava:
(type-name) expression
Tässä,
- Tyypin nimi on tavallinen C-kielen tietotyyppi.
- Lauseke voi olla vakio, muuttuja tai todellinen lauseke.
Kirjoitetaan ohjelma osoittamaan nimenomaisen tyyppivalun toteutus C: ssä.
#includeint main(){float a = 1.2;//int b = a; //Compiler will throw an error for thisint b = (int)a + 1;printf("Value of a is %f\n", a);printf("Value of b is %d\n",b);return 0;}
Tuotos:
Value of a is 1.200000Value of b is 2
- Olemme alustaneet muuttujan 'a' tyyppisen kelluvan.
- Seuraavaksi meillä on toinen muuttuja 'b' kokonaislukutietotyypistä. Koska muuttujat 'a' ja 'b' ovat erityyppisiä tietotyyppejä, C ei salli tällaisen lausekkeen käyttöä ja aiheuttaa virheen. Joissakin C-versioissa lauseke arvioidaan, mutta tulosta ei haluta.
- Tällaisten tilanteiden välttämiseksi meillä on tyypin float-muuttuja 'a'. Käyttämällä eksplisiittisiä tyypinvalintamenetelmiä olemme onnistuneesti muuntaneet kelluvan datatyypin kokonaisluvuksi.
- Meillä on painettu arvo a, joka on edelleen kelluva
- Lajittelun jälkeen tulos on aina kokonaisluku 'b'.
Tällä tavalla voimme toteuttaa eksplisiittisen tyyppivalun C-ohjelmoinnissa.
Yhteenveto
- Kirjoitusta kutsutaan myös tyypin muunnokseksi
- Se tarkoittaa yhden tietotyypin muuntamista toiseksi.
- Pienempien tietotyyppien muuntamista suuremmiksi kutsutaan myös tyyppikampanjoiksi.
- 'C' tarjoaa implisiittisen ja eksplisiittisen tyypin muuntamisen.
- Epäsuora tyypin muunnos toimii automaattisesti, kun yhteensopiva tietotyyppi löytyy.
- Täsmällinen tyyppimuunnos vaatii tyypinvalintaoperaattorin.
Pidä mielessä seuraavat ohjelmointikäytännöt käsitellessäsi eri tietotyyppejä tietojen häviämisen estämiseksi:
- Kokonaislukutyypit tulisi muuntaa kelluviksi.
- Kelluvat tyypit tulisi muuntaa kaksinkertaisiksi.
- Merkkityypit tulisi muuntaa kokonaisluvuksi.