Podcast na Sčítání a odčítání ve dvojkové soustavě
Sčítání a odčítání ve dvojkové soustavě: Kompletní průvodce
Podcast
Binární soustava a aritmetika
Délka: 10 minut
Kapitoly
Úvod do světa nul a jedniček
Jak sčítat binárně
Příklad z praxe
Pozor na přetečení
Přetečení se znaménkem
Proč odčítat sčítáním?
Jedničkový a dvojkový doplněk
Běžné chyby a shrnutí
Délka bitů a simulace
Co ukáže simulace?
Shrnutí a rozloučení
Přepis
Martin: Když jsi dneska ráno otevřel Instagram, každá fotka, každé video, které jsi viděl... v jádru to všechno byly jen obrovské řetězce jedniček a nul. Právě na tenhle tajný jazyk počítačů se dnes podíváme.
Barbora: Přesně tak. Všechny tyhle jedničky a nuly tvoří takzvanou dvojkovou neboli binární soustavu. A důvod, proč ji počítače milují, je vlastně hrozně jednoduchý: elektrické obvody znají jen dva stavy. Buď je tam napětí, nebo není. Zapnuto, nebo vypnuto. Jednička, nebo nula.
Martin: To dává smysl. Posloucháte Studyfi Podcast.
Barbora: A i když to zní složitě, pochopení, jak počítače sčítají a odčítají jen s těmito dvěma číslicemi, je základní kámen celé informatiky.
Martin: Dobře, takže počítač má jen nuly a jedničky. Ale jak s nimi, proboha, počítá? Jak sečte dvě čísla?
Barbora: Je to překvapivě podobné tomu, jak sčítáme my v desítkové soustavě, jen mnohem jednodušší. Jsou jen čtyři základní pravidla. Nula plus nula je nula. Nula plus jedna je jedna.
Martin: To zatím zvládám.
Barbora: Vidíš! Jedna plus nula je taky jedna. A teď to nejtěžší... jedna plus jedna je... dvě. Ale dvojku v binární soustavě nemáme. Takže výsledek je 'jedna nula', tedy 10. Ta nula se zapíše a jednička se 'přenese' do dalšího sloupce, přesně jako když v desítkové sečteš pět plus pět.
Martin: Aha, takže přenos. Jako na základní škole. A co když mám přenos a sčítám k tomu ještě jedničky? Třeba jedna plus jedna plus ten přenos?
Barbora: Skvělá otázka! Pak je to jedna plus jedna plus jedna, což je tři. A v binární soustavě se to zapíše jako 'jedna jedna', tedy 11. Opět, jedna se zapíše a druhá se přenese.
Martin: Dobře, teorii máme. Můžeme si to ukázat na nějakém delším příkladu?
Barbora: Jasně. Vezměme si dvě 8bitová čísla. Třeba 01010110, což je 86, a 00111001, což je 57. Sčítáme je pod sebou, zprava doleva, sloupec po sloupci.
Martin: Tak jdeme na to. Poslední sloupec: nula plus jedna je jedna.
Barbora: Správně. Druhý odzadu: jedna plus nula je taky jedna. Třetí taky. Až v pátém sloupci narazíme na jedna plus jedna. Takže co napíšeme?
Martin: Napíšeme nulu a jedničku si přeneseme dál.
Barbora: Perfektní! A takhle pokračujeme až na konec. Když sečteme i všechny přenosy, vyjde nám 10001111. A když to převedeme zpátky, dostaneme 143. Což je přesně 86 plus 57. Sedí to!
Martin: Páni, takže to fakt funguje. Ale co když je výsledek moc velký?
Barbora: To je přesně ten problém, kterému se říká přetečení neboli overflow. Představ si, že máš 8 bitů. Do nich se vejdou čísla od 0 do 255.
Martin: Jako sklenice, která má objem přesně 255 mililitrů.
Barbora: Přesně tak! A teď se pokus sečíst 200 a 64. Výsledek je 264. Co se stane, když to zkusíš nalít do té naší sklenice?
Martin: No... přeteče to. Všechno, co je nad 255, vyteče ven.
Barbora: A přesně to udělá počítač. Výsledek 264 potřebuje 9 bitů. Ale my máme jen 8. Takže ten devátý bit se prostě zahodí, zmizí. A počítač ti ukáže úplně nesmyslné číslo, v tomto případě 8. Tohle je jedna z nejzáludnějších chyb v programování.
Martin: Minule jsme probrali přetečení u čísel bez znaménka. Ale co čísla se znaménkem? Předpokládám, že tam je to trochu složitější.
Barbora: Přesně tak, Martine. U čísel se znaménkem, typicky v dvojkovém doplňku, je detekce přetečení jiná. Představ si, že sčítáš dvě kladná čísla a najednou ti vyjde záporné.
Martin: Počkat, jak to? To zní jako špatný vtip.
Barbora: Je to tak. Nebo když sečteš dvě záporná čísla a výsledek je kladný. To je jasný signál, že došlo k přetečení.
Martin: A čím je to způsobeno technicky?
Barbora: Stane se to, když se přenos *do* nejvyššího, tedy znaménkového bitu, liší od přenosu, který jde *z* něj ven. Zkrátka, výsledek se už nevejde do daného počtu bitů.
Martin: Dobře, to dává smysl. Ale co odčítání? Proč se počítače vůbec obtěžují s nějakými doplňky? Neumí prostě odčítat přímo?
Barbora: Skvělá otázka. Uměly by to, ale je to pro digitální obvody mnohem složitější než sčítání. Je efektivnější mít obvody, které umí jen sčítat, a odčítání na sčítání převést.
Martin: Takže je to vlastně takový hardwarový life hack.
Barbora: Přesně! A k tomu právě slouží jedničkový a dvojkový doplněk.
Martin: Tak pojďme na ně. Začněme tím jedničkovým.
Barbora: Jednoduše. Jedničkový doplněk získáš tak, že invertuješ všechny bity. Z jedniček uděláš nuly a z nul jedničky. To je všechno.
Martin: A jak s tím odečtu třeba 57 od 86?
Barbora: Takže, chceme spočítat 86 mínus 57. Najdeš jedničkový doplněk čísla 57, přičteš ho k 86 a... tady je ta zvláštnost. Pokud ti vznikne přenos z nejvyššího řádu, musíš ho vzít a přičíst úplně na konec k výsledku.
Martin: Počkat, takže ten bit, co přeteče, se jen tak nezahodí, ale vrátí se zpátky do hry z druhé strany? Jako nějaký bumerang?
Barbora: Přesně tak! Říká se tomu „end-around carry“. Je to specifické jen pro jedničkový doplněk. Ale v praxi se skoro nepoužívá, protože má své mouchy, třeba dvě reprezentace nuly.
Martin: Aha. Takže jaký je ten lepší způsob? Dvojkový doplněk?
Barbora: Ano. Ten je dnes standard. Postup je podobný: invertuješ všechny bity a pak k výsledku přičteš jedničku. Tím získáš dvojkový doplněk.
Martin: A co s tím přenosem na konci? S tím bumerangem?
Barbora: A tady je ta krása... u dvojkového doplňku ho prostě ignoruješ. Zahodíš ho. Výsledek je mnohem čistší a jednodušší.
Martin: Takže abychom to shrnuli. Jaké jsou nejčastější chyby, které studenti dělají?
Barbora: Nejčastěji si pletou právě ty dva doplňky. Hlavně co dělat s tím přenosem na konci – u jedničkového přičíst, u dvojkového zahodit.
Martin: Rozumím. A pak asi to samotné sčítání, že? Třeba jedna plus jedna plus jedna je jedenáct, ne tři.
Barbora: Přesně! Ten přenos do vyššího řádu se nesmí zapomínat. A samozřejmě to přetečení, o kterém jsme mluvili na začátku. Není to jen „moc velké číslo“, ale situace, kdy znaménko výsledku nedává smysl.
Martin: Klíčový poznatek tedy je, že dvojkový doplněk vládne všem, protože je efektivnější a nemá problémy s dvojitou nulou. Díky moc, Barboro! To bylo super vysvětlení.
Barbora: Rádo se stalo, Martine.
Martin: No a když teď umíme sčítat a odčítat... co teprve násobení a dělení? To už zní jako pořádná výzva. Podíváme se na to příště?
Martin: Dobře, takže jsme si ukázali, jak na to s dvojkovým doplňkem. Ale co když čísla nemají stejný počet bitů? To se pak asi celé sesype, ne?
Barbora: To je skvělý postřeh! Nesesype, ale musíš být opatrný. Je kritické udržovat stejnou délku. U záporných čísel prostě zkopíruješ znaménkový bit doleva.
Martin: Aha, takže to je ten trik. Teorie je jedna věc, ale neexistuje způsob, jak si to všechno prakticky osahat? Nějaká simulace?
Barbora: Samozřejmě! Existují interaktivní simulace pro sčítání 8bitových čísel. Tam si to můžeš krásně vyzkoušet.
Martin: Super! A co přesně v takové simulaci uvidím?
Barbora: Uvidíš třeba vizualizaci přenosu. Přesně ten moment, kdy 1 plus 1 dá 10. A taky detekci přetečení, když se ti výsledek prostě nevejde do osmi bitů.
Martin: To je skvělé. Takže hned vidím, kde je problém. A můžu si to porovnat s desítkovou soustavou, abych věděl, že nepočítám nesmysly.
Barbora: Přesně tak. A i když simulace pracuje s 8 bity, principy jsou stejné pro 32 nebo 64 bitů v reálných počítačích. Chápeš tak, jak funguje procesor.
Martin: Fantastické. Takže, abychom to shrnuli. Prošli jsme si dnes základy binární soustavy, sčítání, odčítání pomocí doplňků a teď i praktické simulace. To byl teda nářez.
Barbora: Byl, ale je to naprostý základ pro kohokoli, kdo se zajímá o informatiku. Bez toho se nehneš dál.
Martin: S tím naprosto souhlasím. Barboro, moc ti děkuji, že jsi nám to tak skvěle vysvětlila. Bylo to super.
Barbora: Já děkuji za pozvání, Martine. Ráda jsem přišla.
Martin: Našim posluchačům děkujeme za pozornost a těšíme se na vás u dalšího dílu Studyfi Podcastu. Mějte se hezky!