2

Reprezentace čísel

Pro všechny programátory je důležité, aby rozuměli alespoň základům toho, jak počítače uvnitř pracují a na jakých myšlenkách jsou postaveny. Řidič tramvaje by jistě měl trochu rozumět tomu, jak funguje tramvaj, nebo kuchař tomu, jak funguje trouba. I programátorům se vyplatí mít představu o tom, jak to vlastně počítač dělá, že umí spouštět programy v Pythonu, brouzdat po vodách internetu nebo přehrávat video. Tento článek je takové první nakouknutí pod pokličku toho, co se v té chytré krabici před vámi děje za kouzla. Nemusíte se bát, nebude to zdaleka jen teorie. Právě naopak, dozvíte se mnoho praktických a užitečných věcí, které vám pomohou být lepšími programátory. Navíc díky tomu, že už nějaké základy programování máte, budete si moct všechny pojmy skutečně přímo osahat a vyzkoušet.

Jak počítač počítá

Jak už nám samotný název podsouvá, počítače jsou především o počítání. Pokud však máte za sebou nějaké základy programování v Pythonu nebo JavaScriptu, možná se vám zdá, že jste zas až tolik počítání nepotkali. Spíše jste poznávali funkce, podmínky, cykly, seznamy a další stavební bloky programů. Ovšem při spouštění i velmi jednoduchého prográmku počítač vykonává ohromné množství početních oprací, která nám zatím zůstávají utajeny. Abychom dokázali nahlédnout pod kapotu tohoto procesu, potřebujeme nejprve pochopit, jak mi lidé pracujeme s čísly.

Počítání lentilek

Začneme velice jednoduchým problémem takříkajíc z praxe. Představte si, že v rámci lekce dobrého hospodaření dostanete ve svých brzkých školních letech od rodičů velkou hrst lentilek. Tento poklad je třeba před sourozneci ihned schovat do tajné skrýše. Nejdříve ale musíte lentilky spočítat, abyste měli jistotu, že vám ze skrýše nemizí. Můžete to zkusit podle následujícího obrázku.

Lentilky

S takto rozházenými lentilkami je to dost otravný úkol a je snadné v půlce na nějakou zapomenout. Navíc musíme kvůli lstivým sourozencům lentilky každé ráno přepočítávat znova. Řešení, které nás nejspíš brzo trkne, je uspořádat si lentilky v prostoru tak, aby bylo od pohledu jasné, kolik jich celkem je. Nad následujícím obrázkem nepotřebujeme strávit déle než několik vteřin, abychom zjistili, že lentilek je dohromady 142.

Lentilky desítkově

Tento způsob uspořádání lentilek do skupin souvisí s tím, jak funguje náš běžný způsob zápisu čísel. Zápis 142 nám říká, že máme jednu stovku, čtyři desítky a dvě jednotky lentilek. To můžeme v Pythonu zapsat takto.

>>> 1 * 100 + 4 * 10 + 2 * 1
142

Stejný princip fuguje u všech ostatních čísel. Například rok 2019 znamená

>>> 2 * 1000 + 0 * 100 + 1 * 10 + 9 * 1
2019

Tento způsob zápisu čísel, na který jsem zvyklí už od školky, se jmenuje poziční desítková soustava nebo také hindsko-arabská číselná soustava. Často také uslyšíte název decimální soustava. Skutečnost, že tento systém má svůj název, nás navádí k tomu, že to není jediná možnost jak zapisovat počty lentilek. Například takoví staří Římané by 142 zapsali jako CXXXXII.

Naše desítková soustava má svůj název podle toho, že jejím základem je číslo deset. Hromádky vždy počítáme po jednotkách, desítkách, stovkách, tisících a tak dále. To jsou všechno mocniny desítky, jak si můžeme v Pythonu snadno ověřit.

>>> [10 ** 0, 10 ** 1, 10 ** 2, 10 ** 3]
[1, 10, 100, 1000]

Při zápisu čísel nejdříve používáme jednociferná čísla. Jakmile je vyčerpáme, musíme začít cifry kombinovat do dvouciferných, tříciferných a tak dále. Číselná řada pak vypadá následovně.

Lentilky desítkově

Všimněte si, že nesmíme zapomenout na nulu, což je plnohodnotná cifra jako každá jiná, i když ji při počítání nepoužíváme tak často. Spolu s nulou máme tedy skutečně dohromady deset cifer. To patrně souvisí s tím, že máme na rukou celkem deset prstů. Těm hloubavějším z vás možná začne hlavou vrtat myšlenka, co by se tak stalo, kdybychom měli na rukou jiný počet prstů než zrovna deset. Abychom prozkoumali, kam nás taková zvědavost zavede, uděláme si výlet do jednoho Amerického města, o kterém nikdo netuší, kde ve skutečnosti leží.

Výlet do Springfieldu

To, že Springfield je domovem rodinky Simpsonových, bude asi pro většinu čtenářů tak samozřejmá znalost, jako počet prstů na svých rukou. Všimli jste si ale, že obyvatelé Springfieldu mají na každé ruce pouze čtyři prsty? Pokud nevěříte, zde je důkaz.

Homer Simpson

Pokud obyvatelé Springfieldu přemýšlejí podobně jako my, jejich početní soustava bude na rozdíl od té naší založena na čísle 8. Homer by proto svoje lentilky uspořádal do skupinek po osmi, tedy takto:

Lentilky osmičkově

Na obrázku máme dvě skupiny po 64 (osm skupinek po osmi), pak máme jednu skupinu osmi lentilek a pak nám ještě zbyde šest. Následující výpočet ověřuje, že lentilek je pořád stejně, jen jsme je jinak uspořádali.

>>> 2 * 64 + 1 * 8 + 6 * 1
142

Soustavě se základem osm říkáme osmičková nebo oktalová. Všimněte si, že místo mocnin desítky 1, 10, 100, 1000 atd. používáme k zápisu čísel mocniny osmičky, tedy 1, 8, 64, 512 atd. Zkusme pro příklad zapsat rok 2019 osmičkově.

>>> 3 * 512 + 7 * 64 + 4 * 8 + 3 * 1
2019

Číslo 2019 se tedy osmičkově zapíše jako 3743. Jalikož máme jen osm cifer, při zápisu čísel nám dojdou dříve. V desítkové soutavě začínáme douciferná čísla až od desítky. V osmičkové soustavě musíme jako 10 zapsat už číslo osm, protože pro osmičku už prostě nemáme samostatnou cifru.

Lentilky desítkově

Tady se dostáváme trochu do potíží, protože pokud napíšeme například 15, není jasné, zda tím myslíme patnáct lentilek zapsáno desítkově nebo třináct lentilek zapsáno osmičkově. Programátoři se tedy dohodli, že budou používat speciální notaci pro odlišování soustav. Desítkové čísla zapisujeme jak jsme zvyklí. Osmičková čísla zapisujeme s příponou 0o (nula a malé písmeno o). Pokud tedy chceme zapsat číslo 13 osmičkově, napíšeme 0o15.

Jazyk Python této notaci rozumí, takže pokud do konzole napíšeme osmičkové číslo, Python nám ho rovnou zobrazí desítkově.

>>> 0o15
13
>>> 0o216
142
>>> 0o3743
2019

Pokud naopak chceme vědět, jak vyjádřit např. číslo 142 osmičkově, můžeme použít funkci oct.

>>> oct(142)
'0o216'

Šestnáctková soustava

Osmičková soustava, kterou jsme si představili výše, je spíš tak nějak na hraní. Nic se nestane, když náhodou zapomenete, že existuje. Zato soustava šestnáctková (hexadecimální) je téměř povinnost pro každého programátora. V osmičkové soustavě jsme si počet cifer snížili. Nyní provedeme přesný opak a zásobu si rozšíříme až na šestnáct cifer. Abychom nemuseli vymýšlet nové symboly pro desítku, jedenáctku a tak dále, vypomůžeme si písmenky abecedy. Číslo deset tak zapíšeme cifrou A, jedenáct cifrou B a tak dále až po F. Lentilky pak uspořádáme takto.

Lentilky šestnáctkově

Z obrázku vyčteme, že počet 142 se šestnáctkově zapíše jako 8E nebo 8e. Máme totiž osm řad po šestnácti lentilkách a k tomu ještě dalších 14, což je cifra E. Jelikož tentokrát máme cifer celkem 16, čísla vyjadřujeme pomocí mocnin šetnácti, tedy 1, 16, 256, 4096 atd. Když si uvědomíme, že cifra E je symbol pro čtrnáctku, můžeme si opět číslo 8E rozepsat takto

>>> 8 * 16 + 14 * 1
142

Zkusme ještě náš oblíbený rok 2019, který se zapíše jako 7E3.

>>> 7 * 256 + 14 * 16 + 3 * 1
2019

Jelikož máme v šestnáctkové soustavě k dispozici více cifer, dvojciferná čísla začínají později.

Lentilky šestnáctkově

K odlišení šestnáctkových čísel používáme předponu 0x. Můžete si ji vyzkoušet v Python konzoli.

>>> 0x8e
142
>>> 0x7e3
2019

Chceme-li vyjádřit desítkové číslo šestnáckově (hexadecimálně), můžeme použít funkci hex.

>>> hex(255)
'0xff'

K čemu nám to je?

Možná si říkáte, že věci zbytečně komplikujeme. K čemu je nám dobré představovat si, jak počítají osmiprstí Simpsonovi nebo šestnáctiprsťáci z nějaké divné planety? Odpoveď nalezneme v konstrukci počítačů. Fungování logických obvodů uvnitř počítače totiž může být tím jednodušší, čím méně cifer počítač k reprezentaci čísel používá. Nakonec nás tedy bude nejvíc zajímat soustava, která nemá šestnáct, deset nebo osm cifer, nýbrž cifry pouze dvě. Takové soustavě říkáme dvojková nebo binární a je základem pro reprezentaci úplně všech dat uvnitř paměti počítače. Více o ní v dalším dílu našeho seriálu.

Je záhodno zmínit také to, že soustavy s jiným základem než deset se netýkají jen IT a počítačů. Staří Babyloňané například používali soustavu o základu 60. Z těchto dob nám zbylo dělení hodiny a minuty na 60 dílků. Jsou také lidé, kteří prosazují používat k běžnému počítání místo desítkové dvanáctkovou soustavu. Výpočty v ní jsou totiž o kus jednodušší než v desítkové. Video na toto téma si můžete pustit na mém oblíbeném YouTube kanálu Numberphile. Na stejném kanálu také najdete video, které vás vyvede ze strašlivého omylu, pokud jste si náhodou bláhově mysleli, že všichni lidé na světě přece používají desítkovou soustavu.