Základní pojmy

Informace v počítači jsou uložené v paměti ve dvojkové soustavě. V jazycích C/C++ se často pracuje přímo s pamětí, proto je důležité porozumět tomu, jakým způsobem jsou v ní informace uloženy. Než se tedy vrhnete na programování, naučte se, co je to bit a bajt.

Číselné soustavy

Desítková a dvojková soustava

Ačkoliv se o dvojkové soustavě učí již na základní škole, ne každý si ji pamatuje. Proto jsem se rozhodl na začátek této kapitoly vsunout malé připomenutí toho, oč se vlastně jedná. Pozorně si přečtěte následující dva odstavce a porovnejte je.

Desítková soustava je to, co asi všichni běžně používáme.
Desítková se jí říká proto, protože máte k dispozici právě deset znaků, kterými zapisujeme všechna čísla. Jsou to znaky: 0123456789.
Všimtěte si, že desítková soustasva již nemá znak pro číslo deset, to se musí složit ze dvou znaků: 10.
Všimtěte si, jak se takové číslo v desítkové soustavě vytváří. Dokud máte znak na zapsání čísla, tak jej použijete. Například když chcete napsat číslo devět, můžete použít znak 9. Ale pokud chcete napsat číslo deset, už žádný další znak nemáte (opakuji, máte znaky jen pro čísla nula až devět). V takovém případě napíšete vlevo jedničku, jako že jste jednou vyčerpali všechny dostupné znaky, a nulu k tomu. (Vlevo proto, protože jsme zdědili čísla od arabů).

Příklad: 11(v desítkové s.) = 1*(101)+1*(100) = 10 + 1 = 11 (v desítkové s.)

Dvojková soustava je to, co běžně používají programátoři.
Dvojková se jí říká proto, protože máte k dispozici právě dva znaky, kterými zapisujete všechna čísla. Jsou to znaky: 0 a 1.
Všimtěte si, že dvojková soustava již nemá znak pro číslo dva, to se musí složit ze dvou znaků: 10.
Všimtěte si, jak se takové číslo ve dvojkové soustavě vytváří. Dokud máte znak na zapsání čísla, tak jej použijete. Například když chcete napsat číslo jedna, můžete použít znak 1. Ale pokud chcete napsat číslo dva, už žádný další znak nemáte (opakuji, máte znaky jen pro čísla nula až jedna). V takovém případě napíšete vlevo jedničku, jako že jste jednou vyčerpali všechny dostupné znaky, a nulu k tomu. (Vlevo proto, protože jsme zdědili čísla od arabů).

Příklad: 1011(v dvojkové s.) = 1*(23) + 0*(22) + 1*(21) + 1*(20) = 8 + 0 + 2 + 1 = 11 (v desítkové s.)

Za domácí úkol popište osmičkovou, šestnáctkovou a třeba dvacetisedmičkovou soustavu :)
Nápověda: 13(v osmičkové s.) = 1*(81) + 3*(80) = 8 + 3 = 11 (v desítkové s.)

Na světě je 10 druhů lidí - tí, co rozumí dvojkové soustavě a tí, co ji nerozumí.

Příklad sčítání čísel ve dvojkové soustavě. Zčítá se z prava do leva, podobně jako když sčítáte v desítkové soustavě:

00110101   (= 53 desítkově)
10001100   (=140)
--------
11000001   (=193)

Snad vám tento stručný úvod do dvojkové soustavi stačil. Níže ještě proberu převody mezi různými soustavami a ukážu příklady.

Bit a bajt

Abyste dobře porozuměli programování a počítačům vůbec, musíte vědět, co je to binární kód. V počítači se pomocí binárního kódu zapisuje všechno. Jsou tak zapsány nejenom programy, ale třeba i textové dokumenty, obrázky, videa atp. Je to dáno tím, že hardware je schopen rozeznávat jen dva stavy – například kladný a záporný elektrický náboj, nebo „je v CD ďůlek“ a „není v CD ďůlek“. Tyto stavy reprezentují čísla 1 nebo 0 (mohli bychom je reprezentovat například pejskem a kočičkou, ale s tím by se asi špatně počítalo).
Stav (1 nebo 0) je nejmenší jednotkou informace a nazývá se bit (čti bit). Je jasné, že čím více bitů, tím více informací můžeme zaznamenat (například na DVD jsou menší „ďůlky“ než na CD, proto se na stejnou plochu vejde více informací – více muziky :).

Pomocí jednoho bitu můžete zapsat jen čísla nula a jedna. Pomocí 2 bitů už nula až tři, pomocí 8 bitů 0 až 255 atd. Podívejte se na následující tabulku:

Zápis čísel v desítkové a dvojkové soustavě
Desítková soustava Binární (1 bit) Binární (2 bity) ... Binární (8 bitů)
0 (nula) 0 00 ... 0000 0000
1(jedna) 1 01 ... 0000 0001
2(dva) x 10 ... 0000 0010
3(tři) x 11 ... 0000 0011
... ... ... ... ...
255 (dvěstě padesát pět) x x ... 1111 1111

Dlouhá řada jedniček a nul se špatně čte, proto je zvykem zapisovat čísla ve dvojkové soustavě po čtyřech (a také kvůli snadnému převodu do šestnáctkové soustavy, ale o tom až zachvilku). Takže místo 11111111 budu psát 1111 1111 – mezera je tam jen kvůli čitelnosti.

Byte (čti bajt) je posloupnost 8 bitů. Například největší možné číslo zapsané pomocí jednoho bajtu je 1111 1111 (v desítkové soustavě 255). Číslo 0111 1111 je desítkově 127 atp.

Bajt má 8 bitů z historických důvodů. Prostě dříve nebylo dost peněz na víc bitů :) Hardware byl moc drahý. Určitě jste někdy slyšeli pojem 8-bitové počítače …

Je tu ale ještě jeden problém, jak do toho DVD vypálím číslo se znaménkem, když můžu jen vypálit či nevypálit „ďůlek“, tedy když mám k dispozici jen ty jedničky a nuly?
Můžete si říct, že budete zapisovat čísla se znaménkem tak, že první bit určuje znaménko. Na vlastní hodnotu čísla pak zbyde 7 bitů, takže lze zapsat čísla od -127 do +127.
Bajt 1000 0001 je se znaménkem -1 (kdežto bez znaménka by to bylo 129).

Tohle řešení vypadá hezky, ale je tu drobný problém s nulou. Dá se zapsat jako 0000 0000, ale také jako 1000 0000 (záporná nula)! S tím by se počítačům špatně počítalo.
Při operacích jako je násobení, sčítání a odčítání by si musel processor na tento „extra“ bit dávat pořád pozor. Proto přišli matematici s lepším řešením, tzv. doplňkovým kódem.

V doplňkovém kódu je nula pouze 0000 0000, -1 je 1111 1111, -2 je 1111 1110, -3 je 1111 1101, a nejnižší možné číslo -128 je 1000 0000. Největší číslo pro byte se znaménkem je 127 (0111 1111).

Jestli jde o byte se znaménkem (rozsah 127 až -128) nebo bez (rozsah 0 až 255) nelze nijak poznat, musíme se na tom dohodnout vždy dopředu. Proto existují v jazyku C datové typy se znaménkem (signed) a bezeznaménka (unsigned). K tomu se dostaneme později.

Doplňkový kód, nebo též dvojkový doplňek má další zajímavé (a žádané) matematické vlastnosti, kvůli kterým se používá. Podrobný popis vlastností dvojkového doplňku je však nad rámec této kapitoly a myslím, že se bez něj ve svých začátcích obejdete. Pokud vás zajímají výhody toho to zápisu, najděte si podrobnější informace někde jinde.

V této části jsem ukázal, jak se ukládají celá čísla (se znaménkem nebo bez). Co jsem napsal o jednom bajtu platí obdobně i pro dva bajty (dva bajty, tj 16 bitů, se nazývají slovo, ale to je asi fuk). Dnešní 64-bitové počítače jsou navrženy na práci s čísly skládajícími se z (chvilka napětí) 64-bitů. Pokud chce počítač počítat s čísly tak velkými že se do 64 bitů nevejdou, musí to nějak „očůrat“, což výpočty zdržuje.

Ještě větší sranda je s čísly s desetinnou čárkou. Ty se ukládají tak složitě, že vám to milosrdně zatajím. Nicméně jen pro zajímavost uvedu, že počítače neumí s čísly s desetinnou čárkou počítat moc přesně. (Dokonce nezvládají uložit přesně ani číslo 0.1 a už vůbec ne 1/3. Důsledkem může být, že výpočet (1/3)*3 vyjde 0.9999999999).

Převody soustav

Převod z binární soustavy do desítkové je jednoduchý. Začněte zprava a součet (2^pozice zprava)*bit je hodnota čísla v desítkové soustavě (dvě umocníte na číslo odpovídající pozici bitu zprava (začíná se od 0) a vynásobíte bitem, tj. jedničkou nebo nulou).

Podívejte se na 4 bitové číslo (převádím z prava do leva):

1010 = (20)*0 + (21)*1 + (22)*0 + (23)*1 = 1*0 + 2*1 + 4*0 + 8*1 = 0+2+0+8 = 10

Nejlépe uděláte, když si zapamatujete tuhle tabulku:

bin: 0000 0001 0000 0010 0000 0100 0000 1000 0001 0000 0010 0000 0100 0000 1000 0000
dec: 1 2 4 8 16 32 64 128

Pak už stačí jenom „najít“ odpovídající jedničky z čísla, které převádíte a sečíst hodnoty z druhého řádku. Tj. číslu 1010 odpovídají druhý a čtvrtý sloupeček, tj 2 + 8 = 10.

Převod z desítkové do binární není o moc těžší. Číslo vydělíte dvěma a pokud vám vyjde výsledek beze zbytku, zapíšete 0, jinak 1. Celočíselný výsledek stále dělíte dvěma a 0 nebo 1 zapisujete zprava doleva.

Podívejte se na převod čísla 10d (d označuje desítkovou soustavu):

Deset desítkově se zapíše v dvojkové soustavě jako 1010
Krok ve výpočtuceločíselné dělení (desítkově)mezivýsledek
1.10/2 = 5 beze zbytku, zapisuji 00
2.5/2 = 2 a zbytek 1, zapisuji 110
3.2/2 = 1 beze zbytku, zapisuji 0010
4.1/2 = 0 a zbytek 1, zapisuji 11010

Šestnáctková soustava

Při programování se také setkáte s šestnáctkovou (hexadecimální) soustavou. Ta, jak už název napovídá, využívá k zápisu 16 znaků. Postupně 0, 1, 2 … 9, A, B, C, D, E a F. (Jestli píšete znaky A až F malými nebo velkými písmeny je jedno). Tj. A odpovídá 10d, f je 15d atd.
1 byte může nabývat hodnot 00 až ff (0d až 255d, pokud to iterpretujete beze znaménka).

V jazyce C lze používat k zápisu čísel desítkovou nebo hexadecimální soustavu. Dvojkovou nikoliv. Pokud budete pracovat s bity, je dobré umět převést dvojkovou soustavu na hexadecimální. Převod se dá zjednodušit tím, že budete převádět vždy jen 4 bity do hexadecimální soustavy:

Při převod bajtu (8 bitů) do šestnáctkové soustavy lze převést horní a dolní 4 bity zvlášť.
desítkově binárně hexadecimálně
11 1011 B
12 1100 C
188 1011 1100 BC
203 1100 1011 CB

Ještě se na závěr zmíním, že se v jazyce C používá i osmičková soustava. Osmičková soustava se z dvojkové snadno převádí po 3 bitech (obdobně jako šestnáctková po 4).
Čísla v osmičkové soustavě se v jazyce C zapisují pomocí nuly na začátku. Šestnáctková soustava se zapisuje pomocí nuly a písmena x na začátku.

Ukázka zápisu čísel v různých číselných soustavách jazyce C/C++
desítkově dvojkově osmičkově šestnáctkově
255 11 111 111 0377 0xff

0377 musí mít na začátku tu nulu, 377 by se bralo v jazyce C jako desítkové číslo.

Jaký zápis použijete je úplně jedno, nejčastěji asi budete používat desítkový. Jestli ale někomu vyhovuje více osmičkový zápis, nechť jej klidně používá :-). V určitých situacích, například při adresování paměti, je výhodnější používat šestnáctkovou soustavu. Vždy jde hlavně o to, aby to bylo čitelnější pro člověka, který čte zdrojový kód.

Kilobyte vs Kibibyte

Tyto pojmy se často pletou. 1 kilobyte = 1000 bytů. Ale při práci s počítačem se pracuje s kibibyty. 1 kibibyte = 1024 bytů. To je přesně 210.

Počítejte semnou: 8, 16, 32, 64, 128, 256, 512, 1024.
Jak vidíte, na počátku všeho stojí osmička. A ne náhodou je tato číselná řada násobkem dvou – dvojková soustava ruleeez!

1 Mebibyte = 1024 kibitů = 1048576 bytů.

Zkratky pro kibibyte a mebibyte jsou KiB a MiB. Často se ale velmi nesprávně uvádí KB a MB. Třeba výrobci disků rádi uvádějí velikosti v MB (teda spíš už v GB). Oni i správně uvedou jednotku GB. Když se pak na disk podíváte v PC, počítač vám ohlásí velikost v GiB a vy se divíte, kam se vám poděli stovky megabytů (nebo mebibytů? :-). Widnows vám dokonce drze oznámí, že je velikost uváděna v GB, ikdyž je v GiB.1)

Jestli nechcete být za hlupáky, uvádějte vždy správnou jednotku!
MB a MiB znamenají něco jiného a je na vás, abyste vybrali tu správnou.

Co je to OS

Než vám řeknu, co je to OS (operační systém), podíváme se na to, jak vlastně celý počítač funguje a co se v něm děje od jeho spuštění. Po zapnutí se začne napájet hardware počítače elektřinou a spustí se BIOS. BIOS je program, který je umístěn přímo na základní desce vašeho PC. Hned po spuštění počítače začne zjišťovat, co je na desce za další hardware (např. grafická karta, procesor, pevné disky, paměť). Pokud BIOS najde všechen potřebný hardware pro běh počítače, pokusí se spustit operační systém. Většinou lze nastavit v BIOSu, kde se má OS hledat (na disketě, na CD, USB, nebo na harddisku …). Pokud se BIOSu podaří najít spouštěcí oblast na některém médiu (nebo síti), pak spustí OS a předá mu kontrolu. Operační systém je také program, který má za úkol komunikovat z hardwarem počítače, se vstupními a výstupními zařízeními (klávesnice, myš, modem, monitor, tiskárna …). Operační systém se také stará o běh dalších procesů (programů).

Běžné programy by s hardwarem komunikovat vůbec neměli, a měli by to nechávat na OS. Například, pokud chce program něco vytisknout, předá data operačnímu systému, který je pošle na tiskárnu. K tomu, aby si OS s perifériemi rozuměl (např. s tou tiskárnou, zvukovou kartou atp.) se vytvářejí tzv. ovladače. Ovladače většinou vyrábí výrobce hardwaru pro konkrétní OS. Ovladač je program, který umí na jednu stranu komunikovat s OS a na druhou stranu s hardwarem.

Z předchozího řečeného vyplývají dvě zprávy. Jedna dobrá a jedna špatná. Ta dobrá je, že se nemusíte při psaní programů starat o to, jaký máte hardware v počítači, o to se postará OS. (Při psaní ovladačů by jste se o to samo sebou už starat museli). A teď ta špatná zpráva. Různé OS vytvářejí různí lidé. Proto také programy, o které se OS stará vypadají různě. Vytváříte-li program, pak takový, aby s ním OS dokázal komunikovat. To znamená, že program pro jeden OS nebude fungovat pod jiným OS. (Existují i výjimky, ale program do Windows nebude pracovat v Linuxu a naopak). Ovšem nic není tak zlé, jak se na první pohled vypadá. K tomuto problému (tzv. problém přenositelnosti) se později na chvilku vrátím.

Program a instrukce

Program není opět nic jiného než jenom hromada jedniček a nul. Některé ty jedničky a nuly reprezentují data (např. text, obrázek, cokoliv vás napadne) a některé instrukce. Instrukce jsou příkazy, které říkají, co se má udělat. Instrukce jsou určeny pro procesor, který je umí vykonat (například sečtení dvou čísel) a také pro OS, který jim musí rozumět (například volání funkce pro tisk). Existují různé typy procesorů, například Intel ix86, sparc, mips atp. Samozřejmě co procesor, to jiná sada instrukcí :-(. Pokud tedy vytváříte program, nejste závislí jen na OS, pro který jej vytváříte, ale i na procesoru. Například program pro Windows a 64-bitový procesor Intel nebude fungovat na Windows s 32-bitovým Intel procesorem.

Program je jakýsi návod pro OS, co má s čím dělat, jaké instrukce předat procesoru a tak podobně. Program v binární podobě je pro obyčejného smrtelníka nečitelný shluk jedniček a nul. Ačkoli po prostudování tohoto kurzu jazyka C již normální smrtelníci nebudete, stále pro vás nebude program v binárním kódu čitelný :-).
Dříve se programy psali na děrovacích štítcích (co štítek, to instrukce), ale dnes je již takový způsob programování téměř nemyslitelný. Jak se dá vytvořit program rychle a jednoduše, to se dozvíte v příští kapitole.

Jak program ve skutečnosti pracuje? Co se stane když poklepete ve Windows na ikonku programu? OS se podívá do souboru s programem a zjistí, pro jakou verzi jakého OS byl napsán. Pokud je s tímto programem kompatibilní, začne číst a vykonávat jeho instrukce. Instrukce mohou požadovat například sečtení dvou čísel, vytvoření souboru, nebo vytištění dat (Jinak řečeno, zavolání funkce OS pro tisk. Všimněte si, že program v tomto případě musí vědět jak OS o zavolání funkce požádat, jaká funkce to má být, jak této funkci předat data k vytištění, nebo třeba také to, jak zjistit, zda tisk proběhl v pořádku. To všechno nás opět přivádí k problému přenositelnosti programu mezi různými OS zmíněnému výše.)

Teď už znáte problémy, tak se můžete těšit na jejich řešení v dalších kapitolách :-)


1) Nevím jak je to v novějších verzích Windows, ale jsem skeptik …

Komentář Hlášení chyby
Vytvořeno: 29.8.2003
Naposledy upraveno: 12.5.2010
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..