Mis on tüüpkirjutamine C-s?
Kirjutamine on ühe andmetüübi teisendamine teiseks. Seda nimetatakse ka andmete teisendamiseks või tüübi teisendamiseks. See on C-programmeerimisel kasutusele võetud oluline mõiste.
C-programmeerimine pakub kahte tüüpi valamisoperatsioone:
- Kaudne tüübi ülekandmine
- Selgesõnaline tüübi ülekandmine
Kaudne tüübi ülekandmine
Kaudne tüüpi ülekandmine tähendab andmetüüpide teisendamist, kaotamata selle algset tähendust. Seda tüüpi typecasting on oluline, kui soovite muuta andmetüüpe ilma muutmata tähtsust väärtuste ladestunud muutuja.
Kaudne tüübikonversioon toimub automaatselt, kui väärtus kopeeritakse ühilduvale andmetüübile. Teisendamise ajal rakendatakse tüübi teisendamiseks rangeid reegleid. Kui operandid on kahte tüüpi andmetüübid, teisendatakse madalama andmetüübiga operand automaatselt kõrgemaks andmetüübiks. Seda tüüpi tüüpi teisendamist võib näha järgmises näites.
#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);}
Väljund
1010
- Antud näites oleme deklareerinud lühikese andmetüübi muutuja, mille väärtus on initsialiseeritud 10.
- Teisel real oleme deklareerinud int-tüüpi muutuja.
- Kolmandal real oleme muutujale s määranud muutuja a väärtuse. Kolmandal real viiakse läbi implitsiitset tüüpi teisendamine, kui muutuja s väärtus, mis on lühikese andmetüübiga, kopeeritakse muutujaks a, mis on int andmetüüp.
Märgi teisendamine int
Mõelge näiteks ASCII-s dekodeeritud märgi lisamisele täisarvuga:
#includemain() {int number = 1;char character = 'k'; /*ASCII value is 107 */int sum;sum = number + character;printf("Value of sum : %d\n", sum );}
Väljund:
Value of sum : 108
Siin on kompilaator teinud täisarvu edendamise, teisendades k väärtuse ASCII-ks enne tegeliku liitmistoimingu tegemist.
Aritmeetilise teisendamise hierarhia
Koostaja jätkab esmalt märgi täisarvuks ülendamist. Kui operandidel on endiselt erinevad andmetüübid, teisendatakse need suurimaks andmetüübiks, mis kuvatakse järgmises hierarhiatabelis:
Mõiste mõistmiseks kaaluge järgmist näidet:
#includemain() {int num = 13;char c = 'k'; /* ASCII value is 107 */float sum;sum = num + c;printf("sum = %f\n", sum );}
Väljund:
sum = 120.000000
Esiteks teisendatakse muutuja c täisarvuks, kuid kompilaator teisendab numbrid ja c ujukiteks ja liidab need ujuki tulemuse saamiseks.
Olulised punktid kaudsete konversioonide kohta
- Tüüpi teisendamise kaudset tüüpi nimetatakse ka standardseks tüübi teisenduseks. Kaudse tüübi ülekandmisel ei nõua me märksõnu ega erilisi avaldusi.
- Teisendamist väiksematelt andmetüüpidelt suuremateks andmetüüpideks nimetatakse ka tüübi edendamiseks . Ülaltoodud näites võime öelda ka seda, et s väärtust tõstetakse täisarvuks.
- Kaudne tüübikonversioon toimub alati ühilduvate andmetüüpidega.
Me ei saa teha kaudset tüüpi ülekandeid andmetüüpidele, mis ei ühildu üksteisega, näiteks:
- Ujuki teisendamine int-ks kärbib murdosa, kaotades seega väärtuse tähenduse.
- Kahekordse teisendamine ujukiks ümardab numbreid ülespoole.
- Pika int-i teisendamine põhjustab liigsete kõrgete bittide kukkumise.
Kõigil ülaltoodud juhtudel kaotab andmetüüpide teisendamisel väärtus oma tähenduse. Üldiselt hoiatab koostaja väärtuse tähenduse kaotust.
C-programmeerimine annab veel ühe tüübiülekande viisi, milleks on selgesõnaline tüüpvalamine.
Selgesõnaline tüübi ülekandmine
Kaudse tüübi teisendamisel teisendatakse andmetüüp automaatselt. On mõningaid stsenaariume, kus peame võib-olla sundima tüübi teisendamist. Oletame, et meil on muutuja div, mis salvestab kahe operandi jagunemise, mis on deklareeritud int-tüüpi andmetena.
int result, var1=10, var2=3;result=var1/var2;
Sellisel juhul on pärast muutujate var1 ja var2 jagamist muutujale "result" salvestatud tulemus täisarvu vormingus. Alati, kui see juhtub, kaotab muutujas "tulemus" salvestatud väärtus oma tähenduse, kuna see ei arvesta murdosa, mis tavaliselt saadakse kahe arvu jagamisel.
Sellistes olukordades tüübi teisendamise sundimiseks kasutame selget tüüpi ülekandmist.
See nõuab tüübi valamise operaatorit. Tüübivalamise toimingute üldine süntaks on järgmine:
(type-name) expression
Siin,
- Tüübi nimi on standardne C-keele andmetüüp.
- Avaldis võib olla konstant, muutuja või tegelik avaldis.
Kirjutagem programm, et näidata selgesõnalise tüübiülekande rakendamist C-s.
#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;}
Väljund:
Value of a is 1.200000Value of b is 2
- Oleme initsialiseerinud ujukitüübi muutuja 'a'.
- Järgmisena on meil veel täisarvu andmetüüp muutuja „b”. Kuna muutujad 'a' ja 'b' on erinevat tüüpi andmetega, ei luba 'C' sellist avaldist kasutada ja see tekitab vea. Mõnes „C” versioonis hinnatakse väljendit, kuid tulemust ei soovita.
- Selliste olukordade vältimiseks on meil tüüp-float muutuja „a” tüüp. Selgete tüüpide ülekandemeetodite abil oleme ujuki edukalt teisendanud andmetüübi täisarvuks.
- Meil on trükitud väärtus a, mis on endiselt ujuk
- Pärast trükkimist on tulemuseks alati täisarv 'b'.
Sel moel saame C-programmeerimisel rakendada selgesõnalist tüüpi ülekandmist.
Kokkuvõte
- Tüüpvormimist nimetatakse ka tüübi teisenduseks
- See tähendab ühe andmetüübi teisendamist teiseks.
- Väiksema andmetüübi teisendamist suuremaks nimetatakse ka tüübikinnituseks.
- "C" pakub kaudset ja selget viisi tüübi teisendamiseks.
- Kaudse tüübi teisendamine toimib automaatselt, kui leitakse ühilduv andmetüüp.
- Selgesõnaline tüübi teisendamine nõuab tüübi ülekandmise operaatorit.
Andmete kadumise vältimiseks pidage meeles järgmisi programmeerimistavasid, kui tegelete eri tüüpi andmetega:
- Tervikute tüübid tuleks teisendada ujukiteks.
- Ujuki tüübid tuleks teisendada kahekordseks.
- Märgitüübid tuleks teisendada täisarvuks.