Datový typ

Datový typ definuje v programování druh nebo význam hodnot, kterých smí nabývat proměnná (nebo konstanta). Datový typ je určen oborem hodnot a zároveň výpočetními operacemi, které lze s hodnotami tohoto typu provádět (srovnej abstraktní datový typ). Nemůže být určen pouze oborem hodnot, protože existují i datové typy lišící se pouze v operacích, které je s nimi možné provádět.

Součástí programovacího jazyka je definice základních datových typů. Pomocí těchto základních typů může ve většině jazyků programátor tvořit nové složené typy.

Jednoduché datové typy

Na tuto kapitolu jsou přesměrována hesla jednoduchý typ dat a primitivní datový typ.

Jak již bylo zmíněno, jednoduché (také elementární) datové typy jsou většinou přímo zabudovány do jazyka, přičemž v běžně používaných jazycích nejsou parametrizovatelné. Složitější typy pak mohou vznikat skládáním elementárních datových typů.

Každý počítačový jazyk může mít poněkud odlišnou sadu elementárních datových typů. U mnoha počítačových jazyků závisí parametry elementárních datových typů na architektuře procesoru, na kterém má běžet program. To platí zvláště u kompilátorů jazyka C a C++.

Ordinální datové typy

Níže uvedené typy jsou ordinální. Hodnoty ordinálního typu tvoří lineárně uspořádanou množinu, kde pro každý prvek je přesně definovaný předchůdce i následovník (z posledního prvku ve většině jazyků dochází k přetečení na první). Z funkčního hlediska tak lze k jednoduchým celočíselným datovým typům řadit i výčtový typ, i když jeho hodnoty jsou definovány programátorem. Ordinální celočíselné datové typy jsou základem současné informatiky.

Logická hodnota

Javě a Pascalu odpovídá logické hodnotě typ boolean, který smí nabývat hodnot true nebo false. Logická hodnota je výsledkem porovnání nebo logického výrazu. Logická hodnota bývá obvykle výsledkem výrazu s relačními nebo logickými operátory. Jazyk C tento typ nedefinuje (lze dodat knihovnou stdbool.h), místo hodnoty false používá celé číslo 0, hodnotu true pak reprezentuje jakékoli nenulové celé číslo (i záporné).

Celé číslo

Pro celé číslo se v Pascalu používá typ integer, v jazyce C a C++ int. Čísla 256, 1, 0, -32767, 0xA9 jsou zápisy celočíselných konstant. Poslední konstanta demonstruje možnost hexadecimálního zápisu v jazyce C. Programovací jazyky mohou (ale nemusí) rozlišovat celá čísla bez znaménka a se znaménkem.

Ve většině jazyků mají celá čísla omezený rozsah. Pokud je celé znaménkové číslo omezeno například na 16 bitů, tak bude mít rozsah -32768 až +32767, což je dané kódováním ve dvojkovém doplňkovém kódu. Pokud výsledek operace překročí rozsah, dochází k přetečení (32767 + 1 dá -32768). Znaménková i bezznaménková čísla při běžném kódování vytvářejí algebraický okruh.

Některé jazyky (například Python) místo přetečení pro číslo vyhradí větší množství paměti. Tím je usnadněno programování, avšak snižuje se výkon programu.

Kromě sčítání, odčítání, násobení, celočíselného dělení a zbytku po dělení je možné provádět nad celými čísly i bitové operace, jako jsou logický součin, logický součet a logická negace. Tyto operace se provádí nad jednotlivými bity operandů ve dvojkové reprezentaci.

Znak

Pro znak se obvykle používá označení char – např. 'a', 'A', 'g', ' ', '5', '%', atp. Ve skutečnosti je znak v počítači reprezentován pomocí celého čísla. Pro kódování znaků se většinou používá znaková sada ASCII a její národní rozšíření, nebo znaková sada Unicode. Pro reprezentaci kódového bodu unicode podle současných standardů postačí 21 bitů (jak pro kódovou mapu unicode, tak pro ekvivalentní čínskou mapu GB 18030).

Jazyky, které přímo nevyužívají unicode (například Php) mohou pracovat s unicode zakódovaným po bajtech pomocí kódování utf-8. Další podrobnosti viz článek znaková sada.

Výčtový typ

I když jde o programátorem definovaný typ, lze jej považovat za jistou variantu celočíselného typu. Jde o to, že uživatel může definovat typ například pro barvu karet:

 enum barva {
   piky,
   srdce,
   kary,
   krize
 };

V podstatě jde o celé číslo, které smí nabývat pouze zvolené hodnoty. Díky tomu mohou být programy přehlednější a také lépe laditelné. Při programování by sice pro každou barvu bylo možné definovat konstantu, avšak při ladění by byla v debuggeru v proměnné barva přímo vidět zda jde o piky, srdce, káry nebo kříže ...

Neordinální datové typy

U neordinálních datových typů není jednoznačně určen předchůdce a následovník každé hodnoty.

Reálné číslo

nebo také číslo s plovoucí řádovou čárkou (double, float, real) – 3.14, 0.5 (podle anglosaské konvence zapsané s desetinnou tečkou). V počítači bývá většinou implementováno ve dvojkové soustavě jako mantisa * 2exponent, kde mantisa a exponent jsou celá čísla. Je třeba si uvědomit, že mnohá desetinná čísla nelze v tomto formátu přesně reprezentovat; například číslo 0,1 má periodický dvojkový zápis (0,0001100)2. Důsledkem je, že se reálná čísla v počítači mohou chovat jinak, než by se intuitivně dalo čekat.

Zásadní výhodou reálných čísel je, že mohou ve stejné velikosti paměti reprezentovat mnohem větší rozsah hodnot, než celé číslo. Například 32bitové celé číslo má rozsah řádově +-109 s krokem 1, zatímco 32bitové reálné číslo má typický rozsah řádově +-10+-38 s 6 až 7 platnými číslicemi. Cenou za vyšší dynamický rozsah je horší přesnost u velkých čísel (což často nevadí) a vyšší nároky na architekturu procesoru. Reálná čísla v počítači mohou také nabývat speciálních hodnot, které reprezentují neplatné výsledky. Pro reprezentaci reálných čísel se většinou používají některé z formátů definovaných ve standardu IEEE 754.

Prázdný datový typ

  • void – jedná se o specialitu jazyka C. Tento typ nenabývá žádných hodnot, může sloužit mimo jiné pro deklaraci funkce, která nemá návratovou hodnotu, nebo označovat data nespecifikovaného typu (ukazatel typu void v jazyce C).

V některých jazycích existuje rovněž prázdná hodnota ošetřující neplatný výsledek - null nebo nil, která je vlastně současně zvláštním datovým typem. Výsledkem většiny operací s konstantou nil je opět nil, takže chování programu je deterministické.

Konstanta NULL vyskytující se v jazyce C tento význam nemá, při jejím nevhodném zpracování může snadno dojít k nepředvídatelnému chování programu, které při nedokonalém operačním systému může vést až ke zhroucení počítače.

Složené datové typy

Na tuto kapitolu je přesměrováno heslo Složený datový typ.

Složené datové typy obsahují více prvků: Homogenní jsou, když se skládají z prvků stejného typu.

  • pole (array) – [21, -5, 11], může být vícerozměrné (např. dvourozměrné označujeme jako matici),

Jednotlivé prvky pole jsou dostupné pod číslem, které určuje jejich pořadí (index). Nejčastější je konvence používaná v jazyce C, kde indexy začínají číslem 0. Pro výše uvedené příklady: pole[1] = -5, retezec[0] = 'A' (resp. ' ' a 'l'), obdobně pro výčtový typ.

V některých jazycích musí prvky pole obsahovat pouze položky stejného typu, jiné jazyky to nevyžadují. Hlavní výhodou pole je možnost okamžitého přístupu ke kterékoli jeho položce. Rychlý přístup umožňuje mimo jiné implementaci rychlých algoritmů pro Řadicí algoritmus položek. Čas potřebný ke vkládání nebo odebírání položek lze zmenšit použitím pomocného pole, ve kterém jsou uloženy pouze indexy položek, zvláště pokud jednotlivé položky zabírají větší množství paměti.

  • seznam (list) – obdoba pole, ['a', 'b', 9, „řetězec“]. Na rozdíl od pole nelze seznam přímo adresovat pomocí indexu. V jazyce Lisp, který je na seznamech založený, jsou základními operacemi nad seznamem získání prvního prvku a zbytku seznamu (což je opět seznam). Seznam je tedy možné procházet pouze postupně, od začátku do konce, sekvenčně. Existují i obousměrné spojové seznamy, které je možné procházet od začátku i od konce, avšak omezení přístupu je výrazné. Výhodou seznamů proti polím je, že je možné snadno přidávat nebo odebírat i prvky nacházející se uprostřed seznamu. U pole to často znamená nutnost překopírovat velký počet prvků. Avšak ve srovnání s polem většinou převažují nevýhody dané složitější vnitřní reprezentací.

Záznam může být složen z prvků různých datových typů (opak homogenního) a navenek se chová jako kompaktní celek. Například v jazyku Pascal typ record nebo v  jazyku C typ struct:

 typedef struct {
    int vek;
    char *jmeno;
    enum { muz, zena } pohlavi;
 } Osoba;

Některé programovací jazyky povolují přiřazovat například do polí položky různého datového typu. Výhodou záznamů je však právě to, že jsou pevně definovány. Při práci se záznamem určitého typu se lze spolehnout na to, že bude mít určité položky, jejichž typ je definován.

Zvláštní datové typy

  • ukazatel (pointer) – ukazuje na místo v paměti (například na jinou proměnnou nebo na určitý prvek pole).
  • soubor (file) – reprezentuje soubor. Tento typ definuje rozhraní pro přístup k místním nebo síťovým souborům počítače.
  • komplexní číslo – například v jazyku Python: (2+4j). Některé jazyky mohou přímo podporovat výpočty s komplexními čísly.

Generický datový typ

Jde o datový typ, který může zastupovat více datových typů. Velké možnosti, jak parametrizovat typy, poskytuje systém šablon v C++, nebo generické typy používané v jazycích Java 5, či C# 2.0.

Rozsahy číselných datových typů

V paměti počítače jsou všechna data reprezentována posloupností 1 a 0 (dvojková soustava). Počet míst (bitů) vyhrazených pro daný datový typ omezuje rozsah hodnot, kterých může nabýt. Existuje tak mimo jiné několik datových typů pro celé číslo lišících se podle jazyka. V následující tabulce jsou uvedeny obvyklé hodnoty, používané na překladačích pro 32bitové architektury procesorů:

Datový typ (Pascal / C) Velikost v paměti Rozsah
Celočíselné typy
Boolean / bool 1 bit (ačkoliv obvykle uložen jako 1 bajt) 0 až 1
Byte / unsigned char 8 bitů (= 1 bajt) 0 až 255
Word / unsigned short int 2 bajty 0 až 65 535
Long Word / unsigned long int 4 bajty 0 až 4 294 967 295
Integer / long int 4 bajty –2 147 483 648 až 2 147 483 647
Double Integer / long long int 8 bajtů –9 223 372 036 854 775 808 až 9 223 372 036 854 775 807
Typy s plovoucí čárkou
Real / float 4 bajty 1E-37 až 1E+37 (6 desetinných míst)
Double Float / double 8 bajtů 1E-307 až 1E+308 (15 desetinných míst)

Některé jazyky nevyžadují deklaraci délky proměnné a dynamicky (za běhu programu) přiřazují další paměť, je-li to potřeba. Programátor může například spojovat řetězce nebo přidávat další prvky do pole bez omezení.

Typová signatura

Signatura jednoduchého datového typu Bool a operací (funkcí) na něm by se dala symbolicky zapsat:

Druhy dat:

  • Bool

Operace:

  • true, false : Bool
  • not : Bool → Bool
  • and : Bool, Bool → Bool
  • eq : Bool, Bool → Bool

Související články

Externí odkazy