Projekt OP VK „Inovace studijních oborů zajišťovaných katedrami PřF UHK“ Registrační číslo: CZ.1.07/2.2.00/28.0118
2
Ukládání dat do paměti počítače
Cíl Studenti budou umět zapisovat čísla ve dvojkové, osmičkové, desítkové a v šestnáctkové soustavě a budou umět převádět zápisy čísel mezi jednotlivými soustavami. Studenti porozumí způsobu ukládání celých čísel, reálných čísel, jednotlivých znaků i celých textů a logických proměnných do paměti počítače. 2.1
Vyjádření čísel v různých číselných soustavách
Již od první třídy základní školy, kdy se děti seznamují se základy počítání a matematiky, pracují s čísly v desítkové soustavě. Později se dovídají, že existují i jiné číselné soustavy, a že počítače pracují ve dvojkové soustavě. Následně se pak učí zapisovat čísla v různých číselných soustavách. Připomeňme si tedy, co to jsou číselné soustavy a jaké jsou jejich principy. Začněme desítkovou soustavou. Jejím základem je číslo deset. Každé další číslo pak lze vyjádřit jako příslušný součet násobků mocnin deseti. Pro příklad lze uvést rozklad čísla 456 v desítkové soustavě. 456
4.102
5.101
6.100
400 50 6
Stejný princip platí i pro zápis čísel v libovolné jiné číselné soustavě. Vždy se tedy jedná o příslušný součet násoků mocnin základu dané číselné soustavy. Dekadické číslo 456 lze vyjádřit pomocí mocnin základu dva takto. 456 1.28 1.27 1.26 0.25 256 128 64 8
0.2 4 1.23
1/15
0.2 2
0.21
0.20
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
Obdobně lze číslo 456 vyjádřit pomocí mocnin osmi. 456
7.82
1.81
0.80
448 8
Nejinak je tomu i při zápisu čísla pomocí mocnin šestnácti. 456 1.162
12.161
8.160
256 192 8
Dříve než přistoupíme k zápisu čísla v uvedených číselných soustavách, je třeba si uvědomit, že pro vyjadřování čísel v desítkové číselné soustavě máme k dispozici deset číslicových symbolů (0, 1, 2, ..., 9), ve dvojkové číselné soustavě dva symboly (0, 1), v osmičkové osm (0, 1, 2, ..., 7) a v šestnáctkové šestnáct (0, 1, 2, ..., 9, A, B, C, D, E, F). Teoreticky bychom si tak mohli vymýšlet i další číselné soustavy při libovolném jiném základu. Zabývejme se nyní zápisem několika prvních celých nezáporných čísel v různých číselných soustavách. Začneme nulou, ke které budeme postupně přičítat jedničku. Jakmile vyčerpáme použitelné symboly v daném řádu, musíme přičíst jedničku do vyššího řádu, viz následující tabulka. V posledním sloupci je jenom pro zajímavost uvedeno vyjádření čísel pomocí římských číslic. Je zřejmé, že se pro matematiku jedná o naprosto nevhodnou formu zápisu. Tabulka 2.1 – Zápis čísel v různých číselných soustavách Číselná soustava Římská čísla desítková dvojková osmičková šestnáctková 0 0 0 0 1 1 1 1 I 2 10 2 2 II 3 11 3 3 III 4 100 4 4 IV 5 101 5 5 V 6 110 6 6 VI 7 111 7 7 VII 8 1000 10 8 VIII 9 1001 11 9 IX 10 1010 12 A X
2/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
11 12 13 14 15 16 17 ...
1011 1100 1101 1110 1111 10000 10001 ...
13 14 15 16 17 20 21 ...
B C D E F 10 11 ...
XI XII XIII XIV XV XVI XVII ...
Nyní je již snadné zapsat dané číslo v jednotlivých číselných soustavách, kde index uvádí hodnotu základu dané číselné soustavy. 456 10 111001000 2 710 8 1C8 16 2.2
Paměť číslicových počítačů
Číslicová výpočetní technika pracuje s paměťmi, jejichž nejmenší jednotku tvoří 1 bit, do kterého lze uložit pouze informaci booleovského typu pravda nebo nepravda (true nebo false), tedy číselně 1 nebo 0. Z toho také plyne, že do pamětí počítačů lze ukládat čísla pouze ve dvojkové číselné soustavě. Zcela logicky se tedy můžeme ptát: „Proč bychom se tedy měli zabývat osmičkovou, nebo šestnáctkovou číselnou soustavou?“ Odpověď je zřejmá. Počítač sice pracuje ve dvojkové číselné soustavě, ale příslušný zápis čísel je velice nepřehledný. Rozdělíme-li číslo zapsané ve dvojkové číselné soustavě do skupin po třech, resp. čtyřech číslicích, pak můžeme dané číslo zapsat v osmičkové, resp. šestnáctkové číselné soustavě. 456 10 111 001 000 2 710 8
456 10
1 1100 1000
2
1C8 16
A právě snaha po zjednodušení zápisu a zpřehlednění čtení čísel zapsaných ve dvojkové číselné soustavě je důvodem k tomu, proč v některých případech používáme šestnáctkovou číselnou soustavu. Použijeme-li k zápisu celého čísla např. paměť s kapacitou 4 byte, tj. 4x8=32 bitů, pak ukládáme pro nás velice nepřehledné číslo vyjádřené ve
3/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
dvojkové soustavě, které obsahuje 32 nul či jedniček. Mnohem přehlednější je jeho zápis v šestnáctkové soustavě:
1111 0000 0111 0101 1001 1100 0110 0000
2
F0 75 9C 60 16
Osmičková číselná soustava byla standardně používána v 70 letech minulého století při komunikaci operátorek se sálovými počítači. V současné době již využití osmičkové číselné soustavy je minimální, ale v praxi programátorů je používána šestnáctková soustava, a to např. při psaní některých částí programů, které se týkají práce s barvami. 2.3
Ukládání celých nezáporných čísel
Potřebujeme-li uložit do paměti počítače celé nezáporné číslo, pak musíme v této paměti vymezit prostor, který obsahuje tolik bitů, kolik je potřeba pro vyjádření daného čísla ve dvojkové soustavě. Začněme jednoduchým příkladem, kdy v paměti počítače vymezíme pouze 8 bitů, čili 1 byte. Do tohoto prostoru lze ve dvojkové soustavě uložit číslo v rozsahu 0000 0000 2 až 1111 1111 2 . Tomu odpovídají v desítkové soustavě čísla v rozsahu 0 10 až 255 10 . Budeme-li vytvářet programy např. ve vývojovém prostředí Delphi, pak příslušnou proměnnou, do které budeme ukládat tato celá nezáporná čísla, budeme deklarovat jako proměnnou typu Byte. Je ale třeba si uvědomit úskalí takovéto deklarace. Do proměnné skutečně nelze uložit větší číselnou hodnotu. Jestliže budeme např. postupně přičítat hodnotu 1 do příslušné proměnné, pak se dostaneme maximálně na hodnotu 1111 1111 2 255 10 a přičtením jedničky 0000 0001 2 1 10 dojde k tzv. přetečení, kdy ve všech vymezených bitech budou uloženy nuly a příslušná jednička by měla být zapsána v dalším vyšším řádu. Ten ale je již nezobrazitelný, protože je mimo rozsah vymezené paměti pro uložení proměnné typu Byte. Z toho vyplývá, že v dané proměnné bude uložena výsledná hodnota nula. Pokud si programátor tuto skutečnost neuvědomí, může snadno vytvořit program s tzv. nekonečným cyklem. Stačí, když vytvoří cyklus, ve 4/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
kterém bude řídicí proměnná deklarovaná typu Byte, přičemž v cyklu by měla nabývat maximální hodnoty např. 300. V takovém případě bude cyklus probíhat do hodnoty 255, pak bude pokračovat znovu od 0 do 255, ale nikdy nedosáhne koncové hodnoty 300. Cyklus tedy nikdy neskončí. 2.4 Ukládání celých záporných čísel Záporná čísla je možno v paměti počítače vyjadřovat různými způsoby. Jedním z nich je rezervování nejvyššího řádu dvojkového čísla pro identifikaci znaménka kladného či záporného čísla a v dalších bitech je uloženo číslo ve své absolutní hodnotě. Nevýhodou tohoto zobrazení je skutečnost, že existuje nejenom „kladná“ nula 0000 0000 2 , ale také „záporná“ nula 1000 0000 2 . Druhou možností je vyjádření záporných čísel s tzv. posunutou nulou. V takovém případě lze hodnotě 0000 0000 2 přiřadit dekadické číslo -128. Hodnotě 1000 0000 2 odpovídá dekadická nula a hodnotě
1111 1111 2 odpovídá dekadické číslo 127. Záporná čísla jsou v paměti počítače ale nejčastěji ukládána ve formě dvojkového doplňku, který vznikne tak, že k absolutní hodnotě záporného čísla, vyjádřeného ve dvojkové soustavě, vytvoříme negaci a k té přičteme jedničku. Pro názornost zkusme zapsat ve formě dvojkového doplňku dekadické číslo -5. 0000 0101 2 zápis absolutní hodnoty čísla -5, tedy +5 1111 1010 2
negace zapsaného čísla +5
1111 1011 2
přičtením jedničky získáváme výsledný zápis čísla
-5 ve formě dvojkového doplňku. Obdobným způsobem můžeme zapsat libovolné jiné celé záporné číslo, pokud máme vymezenou dostatečně velkou kapacitu paměti. Tento způsob zapisování záporných čísel odstraňuje problémy s nejednoznačným zapsáním nuly i problémy s posunutou nulou. Zajímá-li nás zpětný převod, to znamená určení absolutní hodnoty záporného čísla, pak nejprve od čísla vyjádřeného ve tvaru dvojkového
5/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
doplňku odečteme jedničku a pak provedeme negaci. Určeme tedy např. absolutní hodnotu čísla 1111 0111 2 .
1111 0111 2
záporné číslo ve tvaru dvojkového doplňku
1111 0110 2
výsledek po odečtení jedničky
0000 1001 2
negací získáme výslednou absolutní hodnotu
zadaného záporného čísla = 9 10 . Pro názornost si můžeme sestavit tabulku se všemi kladnými i zápornými čísly, které lze zapsat do paměti o velikosti 4 bitů. Tabulka 2.2 – Zápis záporných čísel ve tvaru dvojkového doplňku Desítkové číslo Dvojkový doplněk -8 1000 -7 1001 -6 1010 -5 1011 -4 1100 -3 1101 -2 1110 -1 1111 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 Čísla, která jsou zapsána ve formě dvojkového doplňku, lze velice snadno sčítat i odčítat. Máme-li totiž odečíst celé kladné číslo, pak přičteme odpovídající číslo záporné, jak je vidět z následujících příkladů. Případný přenos jedničky do nejvyššího řádu, který je v našem případě mimo
6/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
vymezených 8 bitů, vynecháme, neboť danou hodnotu není možno zapsat do paměti dané velikosti.
Tabulka 2.3 – Ukázka sčítání a odčítání čísel ve dvojkové soustavě. 5+2=7 5–2=3 –5–2=–7 5 0000 0101 5 0000 0101 – 5 1111 1011 2 0000 0010 – 2 1111 1110 – 2 1111 1110 5 + 2 = 7 0000 0111 5 – 2 = 3 0000 0011 – 5 – 2 = – 7 1111 1001 Vidíme tedy, že v nejvyšším bitu (první zleva) je vždy uložena jednička pro čísla záporná a nula pro čísla kladná. Rozsah zapsatelných čísel je pak dán počtem n bitů, které máme v paměti počítače pro tento
2n 1 až 2n 1 1 . V následující tabulce jsou uvedeny využitelné rozsahy dekadických celých nezáporných i záporných čísel, a to v závislosti na velikosti paměti počítače, kterou pro daný zápis vymezíme. Současně jsou uvedeny typy proměnných, které využívá vývojové prostředí Delphi, resp. programovací jazyk Visual Basic. zápis k dispozici. Obecně lze příslušný rozsah vyjádřit zápisem
Tabulka 2.4 – Rozsah celých čísel, která lze zapsat do různě velké vymezené paměti počítače Typ proměnné Rozsah paměti Rozsah čísel (desítkově) Visual Delphi Basic 0 … 255 Byte Byte 1 byte = 8 bit -128 … 127 Shortint 0 … 65 535 Word Char 2 byte = 16 bit -32 768 … 32 767 Smallint Short Longword 0 … 4 294 967 295 (Cardinal) 4 byte = 32 bit Longint -2 147 483 648 … 2 147 483 647 Integer (Integer) 7/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
8 byte = 64 bit
264 ... 264 1 přibližně -9 223 372 036 854 780 000 ... 9 223 372 036 854 780 000
Int64
Long
2128 ... 2128 1
16 byte = 128 bit
přibližně -170 141 183 460 469 000 000 000 000 000 000 000 000 ... -170 141 183 460 469 000 000 000 000 000 000 000 000
Decimal
Při psaní programů a deklarování typů proměnných pro ukládání celých čísel je třeba stále mít na paměti, že může dojít k přetečení vymezeného rozsahu paměti, jak už bylo výše uvedeno. Pokud si programátor neuvědomí odpovídající základní matematické souvislosti, snadno se mu podaří vytvořit programy s nekonečnými cykly. V takových případech překladač nehlásí žádné syntaktické chyby, ale program je nepoužitelný, protože jeho chod nikdy není ukončen. Vrátíme-li se k tabulce 2.4, pak lze např. říci, že v paměti o velikosti 2 byte můžeme ukládat celá čísla v rozsahu -32 768 … 32 767. Chápáno v absolutní hodnotě tak můžeme ukládat čtyřciferná čísla v rozsahu od 0 do 9 999. Můžeme ale také ukládat některá pěticiferná čísla, a to v rozsahu od 10 000 do 32 767. Příslušné výpočty tedy mohou probíhat s přesností 4 – 5 platných dekadických míst. Nelze tedy jednoznačně tvrdit, že všechny výpočty budou realizovány s přesností na 4 nebo naopak s přesností na 5 platných dekadických míst. To je také důvod, proč v návodech ke kalkulačkám se můžeme např. dočíst, že výpočty probíhají s přesností na 10 až 11 platných dekadických míst. Výrobci tedy nemohou uvést, že by výpočty probíhaly právě na 10 nebo právě na 11 platných dekadických míst.
8/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
2.5
Vyjádření reálných čísel v exponenciálním tvaru
Při výpočtech se ale nemůžeme omezovat pouze na práci s celými čísly. Do paměti počítače je třeba vkládat také reálná čísla, tj. čísla s desetinnou částí. Ta jsou ukládána v exponenciálním tvaru. Např. dekadické číslo 42 531,86 lze v exponenciálním tvaru vyjádřit jako 4,253186.104 , kde 4,253186 je mantisa a 4 je exponent zadaného čísla.
Jedná se tedy o dvě samostatná čísla, která pro potřeby ukládání do paměti počítače lze chápat jako celá kladná či celá záporná čísla. Při zápisu reálných čísel s desetinnou částí tedy opět bude vše záviset na rozsahu vymezené paměti počítače. Velikost paměti vyhrazené pro zápis mantisy bude určovat přesnost vyjádření reálného čísla, a tedy počet platných cifer. Velikost paměti vyhrazené pro zápis exponentu bude určovat řádový rozsah zapisovaných čísel. 2.6
Ukládání reálných čísel
Při ukládání reálných čísel do paměti počítače je vymezená paměť počítače rozdělena na dvě části. V první je uložena mantisa daného čísla a ve druhé části je uložen jeho exponent. V následující tabulce jsou uvedeny rozsahy pamětí, které jsou rezervovány pro ukládání reálných čísel, a odpovídající rozsahy dekadických čísel, které lze do vymezených částí paměti zapsat. Současně jsou uvedeny odpovídající typy proměnných, které lze využít při psaní programů. Tabulka 2.5 – Rozsah reálných čísel, která lze zapsat vymezené paměti počítače Počet Rozsah Rozsah čísel platných paměti číslic 38 -45 -3,4.10 … -1,5.10 4 byte = 32 bit 0 7–8 -45 38 1,5.10 … 3,4.10 6 byte = 48 bit -1,7.1038 … -2,9.10-39 11 – 12
9/15
do různě velké Typ proměnné Visual Delphi Basic Single Real48
Single
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
0 2,9.10 … 1,7.1038 -1,7.10308 … -5,0.10-324 0 -324 5,0.10 … 1,7.10308 -1,1.104932 … -3,6.10-4951 0 -4951 3,6.10 … 1,1.104932 7,9228162514264337593543 950335 … -10-28 10-28 … 7,9228162514264337593543 950335 -39
8 byte = 64 bit 10 byte = 80 bit
16 byte = 128 bit
15 – 16
Double (Real)
10 - 20
Extended
28
Double
Decimal
Jestliže v matematice standardně pracujeme s čísly z množiny reálných čísel, pak při práci na počítači si musíme uvědomit, že nemáme k dispozici celou množinu reálných čísel. Pracujeme vždy pouze s určitou podmnožinou množiny reálných čísel, a to v závislosti na deklaraci typu příslušné proměnné, do které budeme ukládat čísla s desetinnou částí. Tato omezení platí nejenom pro programy, které píšeme v libovolném programovacím jazyku, ale samozřemě platí pro jakoukoliv práci na počítači, kalkulačce apod. Můžeme si to ověřit např. při práci s velmi často využívaným tabulkovým procesorem Excel. 2.7
Ukládání čísel v tabulkovém kalkulátoru Excel
Zkusme nejprve nalézt největší celé číslo, které lze zadat do buňky tabulkového kalkulátoru Excel. Když zadáme hodnotu 12 345 678 901, pak na obr. 2.1 vidíme zobrazení příslušného čísla.
10/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
Obr. 2.1 – Zadání čísla s přesností na 11 platných dekadických míst Přidáme-li další cifru, pak hodnota automaticky zobrazena v exponenciálním tvaru.
123 456 789 012
bude
Obr. 2.2 – Zobrazení čísla v exponenciálním tvaru Budeme-li přidávat další cifry, a tedy řádově zvětšovat hodnotu zobrazovaného čísla, pak zjistíme, že všechna čísla budou automaticky zobrazena v exponenciálním tvaru. Zkusme nyní změnit formát buňky podle nastavení, které je uvedeno na obr. 2.3.
11/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
Obr. 2.3 – Nastavení formátu pro zobrazení čísel Následující obr. 2.4 dokladuje, že můžeme zadávat i řádově větší hodnoty, např. 1 234 567 890 123 456.
Obr. 2.4 – Pokus o zadání čísla s přesností na 16 platných dekadických míst Stiskneme-li následně klávesu Enter, pak se číslo v buňce automaticky uloží s přesností na 15 platných dekadických míst.
12/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
Obr. 2.5 – Uložení čísla s přesností na 15 platných dekadických míst. Budeme-li tímto směrem dále pokračovat, pak zjistíme, že následující zadávané cifry jsou automaticky nahrazovány nulami. Excel s těmito číselnými hodnotami bude pracovat jako s reálnými čísly, která mají mantisu vyjádřenou na 15 dekadických platných míst. Zkusme se nyní zabývat otázkou přesnosti výpočtů s využitím všech 15 platných dekadických míst. Do buňky B1 zadejme číslo 1 234 567 890 123 456. Po stisku klávesy Enter se ale v této buňce zobrazí číslo 1 234 567 890 123 450, viz obr. 2.6. Vidíme tedy, že cifra na 16. dekadickém místě byla nahrazena nulou.
Obr. 2.6 – Problémy s výpočty na 15. a 16. platném dekadickém místě Ve sloupci A budeme dále uvádět matematický zápis prováděných operací. Ve sloupci B budou realizovány jednotlivé výpočty. Do buňky B2 vložme číslo 12. V buňce B3 vytvořme součet předcházejících dvou hodnot. Uvědomíme-li si, že Excel dokáže pracovat maximálně s přesností na 15 platných dekadických míst, pak je zřejmé, že z hodnoty 12, jež je uložena v buňce B2, může k číslu z buňky B1 přičíst pouze hodnotu 10, viz obr. 2.6. V buňce B4 nyní vypočítejme rozdíl hodnot uložených v buňkách B3 a B1. K výpočtu použijeme vztah =B3-B1. Budeme-li předpokládat, že Excel zobrazuje stkutečné hodnoty, se kterými počítá, pak by výsledkem 13/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
výpočtu měla být hodnota 10. Ale jak je vidět na obr. 2.6, výsledkem výpočtu je hodnota 12. V buňce B5 vypočítejme rozdíl hodnot uložených v buňkách B3 a B2. Budeme-li opět předpokládat, že Excel ve svých buňkách zobrazuje čísla, se kterými skutečně pracuje, pak bychom neměli jako výsledek výpočtu získat hodnotu, která je uložena v buňce B1. Ale obr. 2.6 dokladuje, že tomu tak není. Celkově tedy můžeme konstatovat, že Excel pracuje s přesností na 15 platných dekadických míst. Na 16. místě se nacházejí hodnoty, které nelze předem jednoznačně předpovídat, ale v některých případech s nimi Excel pracuje. Obdobným způsobem můžeme zkoumat rozsah exponentů při zápisu reálných čísel v Excelu. Na obr. 2.7 je dokladováno, že je možno do buňky zadat číslo 10308. Při zadání čísla 10309 ale už došlo k chybě, takže větší čísla už zadávat nelze, viz obr. 2.8.
Obr. 2.7 – Zadání největšího možného čísla
Obr. 2.8 – Pokus o zadání čísla, které přesáhlo maximální přípustnou mez Zaměříme-li se naopak na záporné hodnoty exponentů, pak zjistíme, že nejmenší možné číslo je řádově 10-307, viz obr. 2.9.
14/15
Vladimír Jehlička
Programování 2 Ukládání dat do paměti počítače
Obr. 2.9 – Zadání nejmenšího možného čísla Při pokusu o vložení menšího čísla, systém převezme zadávanou hodnotu jako nulovou, viz obr. 2.10.
Obr. 2.10 – Pokus o zadání čísla, které překročilo minimální přípustnou mez Vše lze vysvětlit a zdůvodnit ukládáním mantisy a exponentu reálného čísla do vymezené části paměti počítače ve formě dvojkového doplňku. A zde se dostáváme k jádru problému, který souvisí s přesností ukládaných čísel do pamětí kalkulaček a počítačů. V žádném případě se nejedná pouze o problematiku tabulkového kalkulátoru Excel, ale o obecná pravidla, která platí pro práci na počítačích a pro tvorbu programů v libovolném programovacím jazyku. Vrátíme-li se k tabulce 2.5, pak můžeme konstatovat, že tabulkový kalkulátor Excel ukládá čísla v exponenciálním tvaru, který koresponduje s deklarováním proměnných typu Double. K uložení do paměti tedy využívá kapacitu 8 byte a mantisu čísla zobrazuje s přesností na 15 až 16 platných dekadických míst.
15/15