Mluvíme-li o datových strukturách, mluvíme vlastně o tom, jak v paměti počítače ukládat různé informace. Například čísla, text, ale také třeba obrázek či video.
Jeden bit je vlastně kolonka na jednu binární číslici. V jednom bitu může být uložena buď jednička, nebo nula, nic jiného. Půjdeme-li opravdu do hloubky, zjistíme, že počítače vlastně umějí ukládat pouze bity a nic jiného. Celá paměť RAM, nebo vlastně i pevný disk vlastně není nic jiného než ohromné množství bitů, které ukládají jedničky a nuly.
Proto můžeme říci, že bit je elementární a dále již nedělitelnou datovou strukturou. Ve skutečnosti ovšem jeden bit nemusí uchovávat pouze jedničku a nulu. Jednomu bitu lze přisoudit i jiné významy. Jeden bit například může reprezentovat:
0 a 1 (v takovém případě mluvíme o standardní interpretaci bitu)0 = výrok je nepravdivý, 1 = výrok je pravidvý)0) či záporné (1)1) či neprší (0)1) či nesvítí (0)Existují dva základní způsoby, jak z jednoduchých datových struktur vytvářet složitější:
Bajt jako datová struktura vznikne kompozicí osmi bitů, které jsou dále interpretovány jako číslo ve dvojkové soustavě. Bajt, který má osmici bitů 00000110 proto interpretujeme jako číslo 6. Bajt, který má osmici bitů 10101010 interpretujeme jako číslo 170.
Bajt lze ovšem stejně jako bit interpretovat různými způsoby. Zde uvádím několik nejtypičtějších interpretací bajtu:
0 a 255-128 a 127 (v takovém případě se pro uložení používá metoda zvaná dvojkový doplňkový kód)Bajt je možné chápat jako jednu z nejzákladnějších datových struktur. Téměř všechny operace, které dnešní procesory provádějí, jsou prováděny nad celými bajty a nikoliv nad jednotlivými jejich bity.
Celé číslo, neboli Integer se skládá z blíže neurčeného množství bajtů, typicky v množství, které odpovídá nějaké mocnině čísla 2. Velikost integeru se mění podle použitého hardwaru, ale dnes nejčastějšími velikostmi integeru jsou 4 nebo 8 bajtů. Velikost daného integeru ovšem raději udáváme v bitech než v bajtech. 4 bajtový integer má tedy velikost 32 bitů, 8 bajtový integer má velikost 64 bitů.
Jeden 32-bitový integer potom může reprezentovat například:
0 a 4294967295-2147483648 a 2147483647 (opět při použití dvojkového doplňkového kódu)Integer (např. 32-bitový) může vzniknout dvěma způsoby, které jsou ovšem v konečném důsledku ekvivalentní:
0 a 255) a jejich interpretace jako číslo zapsané v 256-kové soustavě.Poznámka: Jakkoliv kompozice 4 bajtů a 32 bitů vychází teoreticky nastejno, v praxi je mezi oběma přístupy drobný rozdíl. To, co totiž není jednoznačné je, jakým způsobem budou seřazeny bajty v integeru. Stejně, jako číslo 1234 můžeme v desítkové soustavě zapsat buď klasicky 1234, nebo trochu neklasicky jako 4321 (což se sice nepoužívá, ale dává to stejně dobrý smysl jako první zápis), tak lze bajty v integeru seřadit buď od nejvýznamnějšího (pak mluvíme o tzv. big endianu) nebo od nejméně významného (pak mluvíme o tzv. little endianu). Způsob řazení bajtů v integeru je vlastnost procesoru. Například procesory Intel (tj. PC-kompatibilní) používají kódování little endian. Naopak při přenosu dat po síti se zásadně používá kódování big endian.
Reálné číslo, také někdy označované jako Float popřípadě Double je způsob reprezentace reálných (nebo přesněji řečeno racionálních) čísel pomocí bitů.
Při reprezentaci je využit jednoduchý mechanismus: Každé číslo lze (s určitou přesností) napsat jako celé číslo vynásobené základem soustavy umocněným na jiné celé číslo. Vezměme například číslo 3.141592. To lze vyjádřit jako 3141592 * 10 ^ -6. Základ (tj. 3141592 v našem případě) je potom nazván mantisou a mocnitel základu soustavy (v našem případě -6) jako exponent. (pozn.: my jsme pro jednoduchost využili k pochopení principu zápis v desítkové soustavě, ve sktuečnosti se ale používá k zápisu soustava dvojková, princip je ale jinak totožný)
Způsob, jakými potom jendotlivé bity reprezentují mantisu a exponent, nejsou úplně přímočaré. Celý formát pro reálné číslo se totiž snaží uspořit co nejvíce místa, což sice zvyšuje přesnost na stejném počtu bitů, je to ovšem za cenu horší přehlednosti celé struktury. Zájemce se na detaily může podívat ve standardu IEEE 754
V obecnosti existuje vícero reprezentací reálných čísel, které se liší počtem bitů, které jsou k reprezentaci reálného čísla použita. Standard IEEE 754 definuje reprezentaci od 16 bitových reálných čísel po 128 bitová.
Reprezentace reálných čísel má oproti reprezentaci celých čísel některé nevýhody, proto ji používáme pouze v případě, že je to nezbytně nutné. Z nevýhod, která jsou specifická pro počítačové zpracování reálných čísel jmenuji tyto:
x + 1 = x. Příčinou tohoto problému jsou opět zaokrouhlovací chyby.Pod pojmem řetězec rozumíme posloupnost bajtů, která má dánu svojí délku. Mluvíme-li o řetězcích, jednotlivé bajty interpretujeme jako znaky. ABC je tak řetězec tří bajtů z nichž první má číselnou interpretaci jako 65, druhý 66 a třetí 67 (viz ASCII).
Chceme-li ovšem řetězec chápat jako posloupnost znaků, nastává jedna komplikace: Na jedné straně ASCII tabulka nedefinuje zdaleka všechny znaky a na druhé straně Unicode (které všechny znaky definuje) vyžaduje víc prostoru než jeden bajt na znak. Tento problém je velmi elegantně vyřešen pomocí UTF-8 kódování. To je založeno na tomto principu:
Výhodou tohoto postupu je, že reprezentuje všechny Unicode znaky a navíc je zpětně kompatibilní s ASCII.
Příklad: Ŕetězec číča by byl v UTF-8 reprezentován jako posloupnost bajtů 196 141 195 173 196 141 97. Znak č je tedy reprezentován jako posloupnost dvou bajtů 196 141, znak í je reprezentován jako posloupnost dvou bajtů 195 173 a znak a, který se nalézá i v ASCII tabulce je reprezentován jako jeden bajt 97.
V jistém smyslu je pole jakýmsi zobecněním řetězce. Zatímco Řetězec lze chápat jako posloupnost bajtů (popřípadě také posloupnost znaků, což jsme ukázali, že například v případě UTF-8 není to samé), pole je posloupností datových struktur stejného typu, které ale nemusí být nutně bajty. Řetězec je tedy de facto speciálním případem pole. Mluvíme-li tedy o poli, musíme mluvit i o datovém typu, který tvoří jednotlivé jeho prvky. Máme pole bajtů, pole Integerů, pole řetězců.
Rozdíl mezi polem a řetězcem je ovšem dán i povahou obou struktur. Mnoho programovacích jazyků má pro řetězec strukturu, která je zároveň polem, nemusí tomu tak ale nutně být. Mluvíme-li o řetězci, potom:
Naopak od pole máme trochu jiná očekávání:
V různých programovacích jazycích mohou existovat různé varianty pole. Důležitým rysem toho kterého programovacího jazyka je, jak se zachová v případě, že zkusíte přistoupit k prvku, který už je za hranicí pole. (např. při pokusu o přístup k 15. prvku v 10ti prvkovém poli). Zatímco některé nižší programovací jazyky (jako Assembler, C či Pascal) hranice pole nehlídají a dovolí vám přistoupit do paměti i za hranicí pole, vyšší programovací jazyky (jako např. Python, PHP, Smalltalk) již hranice pole hlídají. Je nutné poznamenat, že neohlídání hranic pole patří k jedněm z nejnebezpečnějších chyb, kterých se může programátor dopustit. Taková chyba může vést i k ovládnutí počítače útočníkem! Proto je také velice těžké psát v nižších programovacích jazycích, kde se bezpečnostním aspektům programování musí věnovat zvláštní pozornost.