A programozás alapjai 1 A C nyelv típusai 4. előadás Híradástechnikai Tanszék C típusok -void - skalár: - aritmetikai: - egész: - eger - karakter - felsorolás - lebegőpontos - mutató - függvény - union - összetett: - tömb - struktúra Egész típusok A szabvány nem írja elő, de a gyakorlatban előjeles egészeket kettes komplemens kódban előjel nélküli egészeket bináris alakban ábrázolunk Előjel nélküli egészek bináris ábrázolása Előjeles egészek kettes komplemens kódú ábrázolása ovf.... 11...11...1...1 11...1 max. 1 2... 11...11...1...1 11...1-1 1-2 2 + + 1...1 1... 1...11 max min.. 1...1 1...11 1... ovf. 1
Az ábrázolás korlátai Előjeles eger típusok minimális hossz [bit] típus-megadás alakja minimális érték maximális érték Az adott implementációhoz az értékkészletet a <limits.h> file adja meg. rövid short short signed short signed short SHRT_MIN SHRT_MAX normál signed INT_MIN INT_MAX hosszú 32 signed signed LONG_MIN LONG_MAX Előjeles eger típusok Előjel nélküli eger típusok Szám-konstans alakja: Típus Számrendszer decimális oktális hexadeimális Példák 123-33 12 177777 x1a x7fff xaa1bb rövid normál minimális hossz [bit] típus-megadás alakja short short minimális érték maximális érték USHRT_MAX UINT_MAX - -L - -l vagy, ha az érték olyan nagy hosszú 32 ULONG_MAX Előjel nélküli eger típusok Szám-konstans alakja: Típus Példák <mha lenne>u <mha lenne>u <mha lenne>lu <mha lenne>ul <mha lenne>lu <mha lenne>ul vagy, ha az érték olyan nagy Automatikus ábrázolási mód ha nincs megadva U vagy L Amelyikbe a szám-konstans előbb belefér: 1. 2. oktális és hexa esetén 3. 4. 2
A short típusok csak az adat tárolási hosszát írják elő. Számításnál a... short típusú értéket automatikusan... típusúvá alakítja, és azzal számol. Ábrázolás: minimum 8 biten. Ez lesz a tárolás alapegysége típus-megadás alakja signed char char minimális érték SCHAR_MIN maximális érték SCHAR_MAX UCHAR_MAX char CHAR_MIN CHAR_MAX Egyszerű karakterek Különleges karakterek a kis a betű \ aposztróf A nagy A betű \ idézőjel : kettőspont \\ backslash \? kérdőjel \a hangjelzés Különleges karakterek Karakter megadása kódjával \n új sor \ nullás kódú karakter \f lapdobás \1 oktális szám \t tabulátor \x1 hexadecimális szám \v függőleges tabulátor \b visszatörlés 3
Lebegőpontos típusok A char típusok gyakorlatilag az egészekhez hasonlóan viselkednek. Számításnál a... char típusú értéket automatikusan... típusúvá alakítja, és azzal számol. Típus float Konstans alakja 12.3f.12F 12.F.5f 1E-3f 1.8e5f 12.3.12 12..5 1E-3 1.8e5 12.3L.12l 12.l.5L 1E-3l 1.8e5L Min. abs. érték FLT_MIN <= 1e-37 DBL_MIN <= 1e-37 <= m Max. abs. érték FLT_MAX >= 1e37 DBL_MAX >= 1e37 >= m Pontoság [dec. jegy] FLT_DIG >= 6 DBL_DIG >= 1 >= m Aritmetikai típusok konverziója Egyoperandusú konverzió értékadáskor Aritmetikai típusok konverziója Kétoperandusú konverzió műveletvégzéskor formális paraméter aktualizálásakor Alapelv : Túlcsordulás esetén érték megőrzése, ha lehet a kapott érték elvileg definiálatlan 4
Egészből egészbe NINCS túlcsordulás jelzés Ha a hosszésazelőjel is változik, akkor ebben a sorrendben. -1 : 1 1 1 1 1 1 1 1 1. hossz növelése: -1 : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2. előjelesség váltása: : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Ha fordított lenne a sorrend: 1. előjelesség váltása: -1 : 1 1 1 1 1 1 1 1 2. hossz növelése: : 1 1 1 1 1 1 1 1 Mibl char, short rövidebb pl. short rövidebb pl. short hosszabb hosszabb rövidebb + - hosszabb hosszabb rövidebb rövidebb Mibe ugyanakkora hosszabb mindig, minden művetelt előtt Eredmény (felső bitek elvesznek) (felső bitek elvesznek) modulo 2 n, azaz ebbe = ezt + 2 n ( > ~_MAX!!!) Lebegőpontosból lebegőpontosba VAN túlcsordulás jelzés Mibl rövidebb lebegőpontos pl.: float Mibe hosszabb lebegőpontos Eredmény Egészből lebegőpontosba és vissza hosszabb rövidebb, pontosság csökkenhet VAN túlcsordulás jelzés 5
egész Mibl lebegőpontos lebegőpontos egész Mibe Eredmény ha lehet, a pontos érték megtartásával, ha nem: a legközelebbi két érték egyikére, ha nem lehet: túlcsordul törtrész elhagyásával, Lépések sorrendje kétoperandusú műveletek végrehajtása előtt. Ha egyik tömb vagy függvény, akkor mutatóvá konvertálódik 1. Egyoperandusú konverzió a hossz növelésére 2. A két operandus azonos típussá alakítása Egyik operandus float Másik operandus (, ) () () Közös, új típus float Példa: a=3; b=2.3; a=a*b; 3 3. * 2.3 6.9 6 6