Ač jsem se tomu bránil zuby nehty, tak se znovu učím Céčko. Je to již asi po třetí. To je celkem dobrý výkon za půlstoletí no ne. Prvně to bylo někdy okolo roku 1985 když jsem se dostal k CP/M. Pak asi o pět let později, to když jsem začal koketovat s TurboC na PC. No a odtud mě to přivedlo k mikrokontrolerům a potažmo k C51 od Keila. Sakra blbě počítám, tak po čtvrté je to dnes s GCC pro ARMy.

Po mozkové příhodě jsem tedy opět na začátku a Vám nezbude nic jiného, než si to protrpět se mnou A začnu polopatysticky (ne, tentokrát to nebude lopatou po hlavě) výčtem datových typů jazyka C.

Číselné datové typy
Úplně na začátek se podíváme na zoubek datovým typům proměnných. Základní typy v C jsou prakticky stejné jako v jiných jazycích. Pro začátek se budeme věnovat proměnným jednoduchých číselných datových typů, mezi které patří celá a reálná čísla (záměrně ještě zapomínám na vyjmenovaný datový typ enum, na který přijde řada jindy).

Celočíselné typy
Hlavním celočíselným typem v C je typ int. Je dobré preferovat právě tento datový typ, protože je přizpůsoben k tomu, aby operace s ním probíhaly co nejrychleji. V různých implementacích překladačů C může proměnná typu int obsadit 2 nebo 4 byty. Pokud tedy potřebujete mít jistotu, že na různých platformách zabere proměnná 2 byty, můžete použít odvozený typ short int, který by měl tomuto požadavku vyhovět vždy. Lze pro něj také použít zkrácené jméno short.

Dalším celočíselným typem je long int. I u tohoto typu je možné použít zkrácené long. Nejmenším typem, kterým je možno reprezentovat celá čísla je typ char, který zabere v paměti jeden byte a jak je již z jeho názvu patrné, používá se často k ukládání znaků. Ty jsou pak v proměnných uloženy jako ASCII kódy znaků a proto s nimi lze i nadále pracovat jako s čísly.

Použitím slov signed a unsigned ve specifikaci typu proměnné pak rozhodujeme o tom, či typ je pouze kladný, nebo kladný i záporný. Jak asi tušíte, použitím signed proměnné určíme, že může být kladná i záporná a naopak použitím unsigned jí vnutíme, že může nabývat pouze kladných hodnot. Pokud tato slova nepoužijeme, můžeme se spolehnout, že typy int, short a long budou implicitně považovány za signed, nicméně u typu char záleží na konkrétní implementaci překladače a tedy se nelze spolehnout na to, že je typ char implicitně znaménkový, nebo neznaménkový (pokud ovšem nepracujete výhradně v jednom překladači, o kterém víte jak tento typ implementuje).

typdolni mezhorni mezvelikost (v bytech)
unsigned char 0 2551
signed char -128 1271
unsigned short int 0 65 5352
signed short int - 32 768 32 7672
unsigned int 0 65 5352
signed int - 32 768 32 7672
unsigned long int0232-14
signed long int-2312 32-14
unsigned long long int0264-18
signed long long int-2632 63-18
Tabulka ukazuje maximální reprezentovatelné hodnoty pro různé typy a také paměť, kterou objekty těchto typů alokují. Problémem je, že norma jazyka C (ansi) nijak přesně tyto hodnoty nevymezuje. Údaje v tabulce by měly platit pro 16-bitové překladače. V 32-bitovém prostředí bude mít např. int parametry long int. Různé překladače se také mohou lišit rozdílnou implementací záporných čísel a proto se maximální přípustné hodnoty mohou lišit o 1. Naštěstí má každý překladač v souboru limits.h předdefinováné konstanty pro maximální hodnoty typů. Např maximální intová hodnota se dá zapsat pomocí konstanty INT_MAX.

Reálné typy
V C existují tři typy reprezentující reálná čísla. Nejúspornější z nich, co se paměti týče, je typ
float, který ale většinou neposkytuje dostatečnou přesnost. Tu by měl ve většině případů
zajistit typ double. Stejně jako by se měl mezi celočíselnými typy preferovat int, mezi reálnými by to měl být typ double. Pokud budeme potřebovat ještě větší přesnost, poskytuje nám jazyk C ještě typ long double. Následující tabulka ukazuje rozsahy a alokovanou paměť jednotlivých reálných typů.

typmaximumpřesnost (počet desetinných míst)velikost
float3.40282 . 103864
double1.79769313486232 . 10308158
long double1.18973149535723176 . 1049321910

Číselné konstanty
Jazyk C rozlišuje mezi třemi typy celočíselných konstant. Prvním typem jsou konstanty dekadické, které jsou tvořeny libovolným řetězcem číslic, který nezačíná nulou a který ještě může předcházet znaménko ‘+’, nebo ‘-‘.

12; -548,

Naopak konstanty, které nulou začínají jsou interpretovány jako octalová čísla, tedy čísla zapsaná v osmičkové soustavě. Je jasné, že použitelné znaky náleží intervalu 0-7.

014 (octalový zápis dekadického čísla 12)

Konstanty můžeme zapsat ještě v hexadecimálním tvaru tak, že před samotné hexadecimální číslo připojíme prefix 0x, nebo 0X.

0x15 (21 dekadicky)
0x3e
0xEF

Všechny konstanty jsou typu int. Vyjímku tvoří ty konstanty, které se nevejdou do rozsahu čísel int a proto musí být nějakého jiného typu s dostatečným rozsahem (např. long
int). Typ konstanty můžeme ještě explicitně ovlivnit sufixy U a L (na velikosti nezáleží. (stále mluvím o sufixech )). Sufix ‘U’ určuje, že konstanta bude neznaménkového typu
(unsigned) a ‘L’ zase vynucuje použití typu long int. Oba sufixy se mohou v libovolném pořadí kombinovat.

15L  (konstanta typu long int)
65984Ul (konstanta typu unsigned long int)

Pro reálné konstanty existují dva způsoby zápisu. Prvním z nich je zápis ve tvaru s desetinnou tečkou.

1 (typ int!)
1.0 (typ double)
.23
-.378
-125.5484

Druhou možností je použití semilogaritmického tvaru.

15e-6
485E5

Reálné konstanty jsou typu double, ale podobně jako v případě reálných konstant se použije reálný typ s větším rozsahem, pokud by typ double nebyl schopen hodnotu obsáhnout. A i pro
reálné konstanty existují sufixy, kterými se dá výsledný typ ovlivnit. Jsou to znaky L a F. Sufixem L si vynutíme použití typu long double a sufix F mění typ na float.

3.6f
-.99F
0.4858L

Definice proměnných
Teď, když už známe typy, můžeme si nadefinovat proměnné. Na rozdíl od Pascalu se v definici proměnné v C píše nejdříve typ proměnné, který je následován indentifikátorem.
Celá definice je pak zakončena znakem “;”.

int a;

V příkladu jsme nadefinovali proměnnou ‘a’, která je typu signed int. Je ale možné definovat více proměnných najednou a to jednoduše tak, že jednotlivé identifikátory oddělíme čárkou a
středník zapíšeme až za poslední identifikátor.

double p, q, r;

Definici proměnné lze hned také spojit s její inicializací. Proměnnou můžeme inicializovat libovolným výrazem, který je vyhodnotitelný v době vzniku proměnné.

short int a=1;
long b=2*10+1, c;
int d=INT_MAX;

Tak to je pro dnešek všechno. Příště to bude... ehm... To vlastně ještě nemám naplánováno, takže se nechte překvapit.

Základ tohoto seriálu pochází někde z hlubin českého netu, nemám poznamenán zdroj, pokud ho znáte, tak mě prosím doplňte. Děkuji