Téma tohoto dílu bude trochu jiné a na první pohled vzdálené vývojovým diagramům. K algoritmizaci a potažmo k vývojovým diagramům datové typy patří.
Ve 3. díle jsme si řekli, co je to proměnná a pak jsme je používali v různých situacích a kombinacích od těch nejjednodušších až po ty složitější. Když jsme například vytvořili algoritmus pro součet 2 čísel, tak jsme si založili pro tyto 2 čísla proměnné, do nich jsme načetli od uživatele hodnoty, které jsme následně sečetli a výsledek uložili do další proměnné. Nezajímali jsme se, kde a jak jsou uloženy, a právě toto bude předmětem tohoto a následujících dílů.
Každá proměnná musí určeny 2 vlastnosti:
- množinu přípustných hodnot
- množinu přípustných operací.
Datový typ - souhrnný popis vlastností proměnné.
Datových typů je několik druhů a lze je rozdělit do těchto kategorií:
- jednoduché datové typy
- strukturované datové typy
- ukazatel
- datový typ podprogram
- objekt
Ordinální datový typ
Ordinální datové typy se vyznačují tím, že jejich hodnoty jsou uspořádány podle velikosti od nemenšího po největší. Je tedy znám počet hodnot ordinálního datového typu, které jsou zobrazitelné na množině celých čísel. Mezi ordinální datové typy patří logická hodnota, znak, celá čísla, výčet a interval.
Celá čísla
Celočíselné datové typy jsou určeny k uložení celých čísel (např. 10, -8946 atd.) a rozlišují se podle velikosti a dále na znaménkové a neznaménkové.
Velikost celočíselného datového typu je daná počtem bajtů, na kterých je uložen. Bajt je složen z 8 bitů a celá čísla jsou v počítačích uložena na 1, 2, 4 nebo 8 (větší není zatím třeba uvažovat) nebo-li na 8, 16, 32 nebo 64 bitech (neplést s architekturou OS nebo procesoru).
Neznáménkové typy využívají všechny bity na hodnotu, kdežto znaménkové používají nejvyšší bit na rozlišení znaménka (0 značí + a 1 značí -). Neznáménkové typy tak mají rozsah od 0. Naproti tomu znaménkové mají 0 uprostřed svého rozsahu. Následují dva přehledy (neznáménkové a znaménkové) celočíselných typů s jejich slovním označením, počtem bajtů, která zabírají a rozsahem:
- byte - 1 bajt - rozsah 0 až 255
- word - 2 bajty - rozsah 0 až 65535
- dword - 4 bajty - rozsah 0 až 4294967295
- qword - 8 bajtů - 0 až 18446744073709551615
- short integer (nebo jen shortint nebo jen short) - 1 bajt - rozsah -128 až 127
- integer (nebo jen int) - 2 bajty - rozsah -32768 až 32767
- long integer (nebo jen longint nebo jen long) - 4 bajty - rozsah -2147483648 až 2147483647
- long long integer (nebo jen long long) - 8 bajtů - rozsah -9223372036854775808 až 9223372036854775807
Označení jak to tak bývá není jediné, takže se můžete setkat s tím, že jménem je označena velikost (např. int) a slovy signed a unsigned se rozlišuje znaménkový a neznáménkový typ. Případně, že název označuje datový typ s jiným počtem bajtů než jaký je uveden v tabulce.
Na předcházejícím obrázku je zobrazen princip uložení 1 bajtové hodnoty neznaménkového čísla (byte). Výsledná hodnota je rovna součtu hodnot bitů, které jsou v 1. Například hodnota 1 je uložena jako 00000001 = 20 (hexadecimálně 0x01), hodnota 10 je uložena jako 00001010 = 23 + 21 (0x0A), hodnota 255 je uložena jako 11111111 (0xFF) atd. Některé hodnoty jsou přehledně uvedeny v následující tabulce.
U znaménkových čísel je situace trochu složitější. V principu by se mohla použít "metoda" první bit znaménko a zbytek je číslo, nebo-li bychom např. číslo 10 zapsali jako 00001010 a číslo -10 bychom zapsali jako 10001010. Problém je dvojí: jednak bychom měli 2 nuly (kladnou a zápornou) a pak také bychom nemohli provádět výpočetní operace přímo (sečtení 10 + (-10) bychom měli dostat 0, ale to pro předchozí zápis nedostaneme).
Pro zápis záporných čísel se proto používá tzv. dvojkový doplněk, takže číslo -1 se zapíše jako 11111111 (0xFF), číslo -10 se zapíše jako 11110110 (0xF6) a číslo -128 se zapíše jako 10000000 (0x80). Vše nejlépe demonstruje graf na předchozím obrázku.
Znak
Datový typ znak je v podstatě celočíselný datový typ (short nebo byte), který se nazývá char. Rozdíl proti datovému typu short je v tom, že číselné hodnoty se interpretují jako znaky dle ASCII tabulky (např. číslo 32 značí mezeru, číslo 65 značí znak 'A' atd.).
ASCII tabulka je rozdělena do dvou částí. První část obsahuje řídící kódy, symboly, písmena a číslice. Druhá část obsahuje rozšíření pro další jazyky a liší se použitou kódovou stránkou. Doplňuje tak první část o lokální znaky - v případě češtiny jsou to zejména znaky s diakritikou.
Každá použitá znaková sada má svojí druhou polovinu jinak. Pro češtinu existuje několik nekompatibilních kódování, takže s textem se musí nést informace o použitém kódování. Nejenom tento problém řeší UNICODE, kde na jeden znak jsou použity 2 bajty (jedná se tedy o word). Označení takového datového typu je wchar.
Logická hodnota
Jedná se o nejjednodušší datový typ, který může nabývat pouze dvou hodnot, a to true (1) nebo false (0). Označení tohoto typu je boolean (nebo jen bool). Ač velmi jednoduchý, tak hojně používaný. Například výsledek každého testu v podmínce je logická hodnota.
V některých implementacích zabírá datový typ boolean opravdu jen jeden bit. Zejména ve vysokoúrovňových jazycích se s ním buď již nesetkáme nebo se jeho uložení provádí na více bajtů (jedná se výčtový typ viz dále).
Výčet
Datový typ výčet (jeho množinu hodnot) určujeme seznamem identifikátorů. I tento datový typ je ordinální, jednotlivým identifikátorům jsou přidělena pořadová čísla: první identifikátor má hodnotu 0, druhý identifikátor má hodnotu 1, … atd.
Typický problém řešený pomocí datového typu výčet je takový, že máme množinu přípustných hodnot (např. barvy karet). Mohli bychom je označit čísly, ale program by tak byl mnohem hůře čitelný. Vytvořili bychom si proto datový výčet BarvyKaret, kterému bychom přiřadili položky: srdce, kary, piky, krize. V programu bychom pak místo čísel 0, 1, 2, 3 používali hodnoty srdce, kary piky, krize, což zvyšuje čitelnost programu.
Interval
Jde také o obecný datový typ, jelikož nemá přidělen vlastní identifikátor. Ten opět (jako u datového typu výčet) tvoří uživatel – tedy určuje rozsah hodnot, které patří do tohoto datového typu.
Interval vždy vychází z nějakého jiného datového typu, který nazýváme bázový typ. Hodnoty intervalu jsou pak podmnožinou bázového datového typu. Každý datový typ interval je popsán dvojicí konstant, které udávají nejmenší a největší hodnotu intervalu.
Typický příklad použití je takový, že chceme omezit rozsah platných hodnot. Například školní známka má rozsah 1 až 5. Při použití nejmenšího datového typu (byte) bychom dostali rozsah 0 až 255. Vytvořili bychom si proto datový typ interval SkolniZnamka, který by byl v rozsahu 1 až 5 (1..5
) a jeho bázový typ by byl byte.
Neordinální datový typ
Neordinální datové typy budeme chápat tak, že hodnoty takového typu nejsou zobrazitelné na množině celých čísel. Mezi neordinální datové typy patří datový typ pro popis racionálního čísla, tedy čísla, jehož počet desetinných míst je konečný.
Datové typy racionálních čísel
Datových typů pro uložení racionální čísel je (stejně jako celočíselných) více. Liší se samozřejmě rozsahem, ale také přesností. Teoreticky platí, že mezi dvěma libovolnými desetinnými čísly je nekonečno desetinných čísel. K tomu bychom v počítači potřebovali nekonečno bajtů, což samozřejmě nemáme, takže uložená čísla mají omezenou přesnost a nejsou spojité, ale diskrétní (jejich hodnota se mění skokově). Z toho vyplývá, že do proměnné datového typu racionální číslo nelze uložit jakékoliv takové číslo, ale pouze nejbližší možné (o což se nemusíme starat, zaokrouhlení se provede automaticky).
Jak již bylo řečeno, datových typů pro uložení racionálního čísla je více a patří mezi ně:
- single s rozsahem 1,5x10-45 až 3,4x1038 (4 bajty)
- real s rozsahem 2,9x10-9 až 1,7x1038 (6 bajtů)
- double s rozsahem 5,0x10-324 až 1,7x10308 (8 bajtů)
- extended s rozsahem 3,4x10-4932 až 1,1x104932 (10 bajtů)
Racionální čísla jsou ukládána jinak než celočíselné hodnoty. Místo vyhrazené pro uložení čísla je rozděleno na znaménkový bit (s), mantisu a exponent. Výsledná hodnota racionálního čísla se vypočítává podle daného vzorce. Na následujícím obrázku je naznačeno rozdělení pro typ single (4 bajty) včetně vzorce pro výpočet. Typy, které jsou uloženy na více bajtech, mají více bitů rozdělených mezi mantisu a exponent, takže jednak mají větší rozsah, ale i větší přesnost.
Mantisa se ukládá v tzv. normalizovaném tvaru, kde první bit je vždy jedničkový, a proto se nemusí ukládat (je možno ho ušetřit). Výslednou hodnotu m lze jednoduše spočítat přidáním 1 před mantisu, převodem na celé číslo a vydělením hodnotou 223. Uložení různých racionálních čísel a výpočet jejich hodnoty demonstruje následující tabulka.
Porovnáním toho, co jsme se zatím dozvěděli, je vidět rozdíl mezi uložením celočíselné hodnoty a racionálního čísla. V příštím díle si ukážeme použití datových typů ve vývojových diagramech a zejména vhodnost výběru použitého datového typu.