Datový typ

Z Wikipedie, otevřené encyklopedie

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). 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 tzv. přetečení na první). Z funkčního hlediska tak můžeme 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

V 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, 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ř. 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 tzv. 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ř. 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 typicky 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ř. 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, můžeme jej považovat za jistou variantu celočíselného typu. Jde o to, že uživatel může definovat typ např. 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í bychom sice pro každou barvu mohli definovat konstantu, avšak při ladění bychom měli 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ř. čí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ž bychom intuitivně čekali.

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ř. 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 (která nám č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.

Prázdný datový typ

  • void – jedná se o specialitu jazyka C. Tento typ nenabývá žádných hodnot, může sloužit např. pro deklaraci funkce, která nemá návratovou hodnotu, nebo označuje 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 C-jazyce bohužel 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í (tzv. index). Nejčastější je konvence používaná v C-jazyce, 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 např. 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. Např. 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ř. 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ř. 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. Když pracujeme se záznamem určitého typu, můžeme se 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ř. na jinou proměnnou nebo na určitý prvek pole). Jde o dosti silný, avšak také velice nebezpečný nástroj
  • 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ř. 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 např. několik datových typů pro celé číslo liší 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 / --- 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 např. může 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