# 17 — Číselné soustavy > [!abstract] O tématu > ==**Číselná soustava**== = způsob zápisu čísel pomocí omezené sady číslic. V počítačích jsou klíčové ==**dvojková, šestnáctková a desítková**== soustava. > [!info] Maturitní otázka > **a)** Využití číselných soustav · **b)** Převody · **c)** Aritmetické operace · **d)** Polyadický zápis · **e)** Kódování · **f)** Zobrazení dat v PC --- ## a) Využití číselných soustav ==**Všechny informace v počítačích jsou reprezentovány číslicemi.**== N-tice znaků v binární soustavě se nazývá ==**n-bitové číslo**== (např. `010100` = šestibitové číslo). | Soustava | Základ | Číslice | Použití | |---|---|---|---| | ==**Dvojková (binární)**== | 2 | 0, 1 | **vnitřní reprezentace dat v PC** | | ==**Osmičková (oktalová)**== | 8 | 0–7 | starší systémy, oprávnění v Unixu (chmod 755) | | ==**Desítková (dekadická)**== | 10 | 0–9 | **běžný zápis pro lidi** | | ==**Šestnáctková (hexadecimální)**== | 16 | 0–9, A–F | **paměťové adresy, MAC adresy, barvy (#FF00AA)** | ### Proč v PC binární a ne desítková? ==**Elektronika rozezná snadno 2 stavy**==: napětí je (1) / není (0). Tranzistor = vypnutý/zapnutý. ==**Desítková by vyžadovala 10 různých fyzikálních stavů**== — náchylné k chybám. --- ## b) Převody mezi soustavami ### Desítková → Dvojková ==**Postupné dělení 2**==, zbytky čteme zdola nahoru. > [!example] 25₁₀ → ?₂ > 25 / 2 = 12, zb. **1** > 12 / 2 = 6, zb. **0** > 6 / 2 = 3, zb. **0** > 3 / 2 = 1, zb. **1** > 1 / 2 = 0, zb. **1** > → 25₁₀ = **11001₂** ### Dvojková → Desítková ==**Sečteme mocniny 2**==, kde je v binárním zápisu 1. > [!example] 11001₂ → ?₁₀ > 1·2⁴ + 1·2³ + 0·2² + 0·2¹ + 1·2⁰ > = 16 + 8 + 0 + 0 + 1 = **25₁₀** ### Dvojková ↔ Šestnáctková ==**Snadno: 1 hex číslice = 4 bity**==. Seskupíme po 4 bitech od konce. > [!example] 11001₂ → ?₁₆ > 11001 → 0001 1001 → **19₁₆** > > Tabulka: > 0000=0, 0001=1, ..., 1001=9, 1010=A, 1011=B, 1100=C, 1101=D, 1110=E, 1111=F ### Dvojková ↔ Osmičková ==**1 oktalová číslice = 3 bity**==. Seskupíme po 3 bitech. > [!example] 11001₂ → ?₈ > 11 001 → 011 001 → **31₈** ### Převod desetinné části (dec → bin) ==**Postupné násobení 2**==, celé části čteme shora dolů. > [!example] 0,625₁₀ → ?₂ > 0,625 · 2 = **1**,250 > 0,250 · 2 = **0**,500 > 0,500 · 2 = **1**,000 → konec > → 0,625₁₀ = **0,101₂** > [!tip] Pomalý vs. rychlý převod > - **Pomalu**: přes desítkovou soustavu (polyadický zápis) > - **Rychle**: přímo přes bitovou mřížku (3 bity pro oktal, 4 bity pro hex) --- ## c) Aritmetické operace v různých soustavách ### Sčítání v binární Stejně jako v desítkové, ale **přenos při 1+1**: ``` 1 0 1 1 + 0 1 1 0 ───────── 1 0 0 0 1 ← přenos do vyšší pozice ``` Pravidla: - 0 + 0 = 0 - 0 + 1 = 1 - ==**1 + 1 = 10**== (přenos) - 1 + 1 + 1 = 11 (přenos) ### Odčítání v binární Pravidla: - 0 − 0 = 0 - 1 − 0 = 1 - 1 − 1 = 0 - ==**0 − 1 = 1 (s výpůjčkou)**== ### Násobení binární Postup stejný jako v desítkové — násobíme bit po bitu a sčítáme posunuté řádky. ``` 1 1 0 0 1 × 1 1 0 1 ───────────── 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 ───────────── 1 0 1 0 0 0 1 0 1 ``` ### Dělení binární Funguje jako písemné dělení v desítkové — porovnáváme dělitele s aktuálním zbytkem. ### V hexadecimální Stejná pravidla jako v desítkové, ale s číslicemi 0–F. ==**A=10, B=11, C=12, D=13, E=14, F=15**==. --- ## d) Polyadický zápis čísla ==**Polyadický zápis**== = ==**zápis čísla pomocí mocnin základu**==. Je to základ pro převody mezi soustavami. ### Obecný vzorec Pro soustavu o základu **Z** a koeficienty **aᵢ** (číslice): ==**N = aₙ·Zⁿ + aₙ₋₁·Zⁿ⁻¹ + ... + a₁·Z¹ + a₀·Z⁰ + a₋₁·Z⁻¹ + ...**== - **N** — číslo - **aᵢ** — koeficient (číslice na daném řádu) - **Z** — základ soustavy ### Příklad desítkový ==**375 = 3·10² + 7·10¹ + 5·10⁰**== = 3·100 + 7·10 + 5·1 = 300 + 70 + 5 = 375 ✓ ### Příklad binární ==**1101₂ = 1·2³ + 1·2² + 0·2¹ + 1·2⁰**== = 8 + 4 + 0 + 1 = **13₁₀** ### Příklad hex ==**2A₁₆ = 2·16¹ + A·16⁰**== = 2·16 + 10·1 = 32 + 10 = **42₁₀** ### Příklad s desetinnou částí ==**1101,01₂ = 1·2³ + 1·2² + 0·2¹ + 1·2⁰ + 0·2⁻¹ + 1·2⁻²**== = 8 + 4 + 0 + 1 + 0 + 0,25 = **13,25₁₀** --- ## e) Kódování ==**Kód**== = ==**vzájemně jednoznačné (bijektivní) přiřazení**== prvků jedné množiny do druhé. Soustava `Z = φ(I)`, kde **I** = množina informací, **Z** = množina obrazů, **φ** = pravidla přiřazení. ### Kódování čísel - ==**BCD (Binary-Coded Decimal)**== — každá dekadická číslice 0–9 se zakóduje ve 4 bitech samostatně (např. 9 = `1001`) - ==**Grayův kód**== — sousední čísla se liší ==**vždy jen v jednom bitu**==. Používá se ve snímačích polohy (méně chyb při přechodu). ### ASCII ==**American Standard Code for Information Interchange**== - ==**7 bitů**== → 128 znaků (často 7+1 paritní bit) - obsahuje: písmena A–Z, a–z, číslice, interpunkci, řídicí znaky - ==**'A' = 65, 'a' = 97, '0' = 48**== - chybí česká písmena! ### Rozšířené ASCII (CP1250, ISO-8859-2) - ==**8 bitů**== → 256 znaků - doplněno o národní znaky (česká diakritika) - Windows = ==**Windows-1250 (CP1250)**== ### Unicode ==**Univerzální standard**== — všechny znaky všech jazyků světa. Zápis: ==**U+ kódový bod**== (např. `U+2600` = ☀, `U+1F30D` = 🌍). ### UTF-8 ==**Nejrozšířenější kódování Unicode**==: - ==**proměnná délka 1–4 byty**== na znak - ASCII znaky zůstávají 1 byte (zpětně kompatibilní) - české písmeno = 2 byty - emoji = 4 byty - ==**standard na webu i v moderních OS**== ### Další kódování - ==**UTF-16**== — 2 nebo 4 byty (Windows interně) - ==**Base64**== — kódování binárních dat do textu (e-mail) - ==**URL encoding**== — `%20` místo mezery v URL --- ## f) Zobrazení dat v počítači ### Celá čísla (integer) #### Bez znaménka (unsigned) | Typ | Bitů | Rozsah | |---|---|---| | **byte** | 8 | 0 – 255 | | **short** | 16 | 0 – 65 535 | | **int** | 32 | 0 – ~4,3 mld | | **long** | 64 | 0 – ~1,8·10¹⁹ | #### Se znaménkem (signed) — tři způsoby zápisu | Kód | Princip | Problém | |---|---|---| | ==**Přímý kód**== | MSB = znaménko (0=+, 1=−), zbytek = velikost | ==**kladná i záporná nula**== (`0000` i `1000`) | | ==**Inverzní kód**== | záporné = ==**jedničkový doplněk**== (inverze bitů) | ==**kladná i záporná nula**== | | ==**Doplňkový kód**== (two's complement) | záporné = ==**inverze + 1**== | znaménko je součást čísla → ==**jen jedna nula**== | V praxi se **vždy používá doplňkový kód**, protože: - ==**Nejvyšší bit = znaménko**== (0 = +, 1 = −) - záporné číslo = ==**inverze bitů + 1**== - výhoda: ==**sčítání funguje stejně pro + i −**== (HW jednodušší) | Typ (signed) | Bitů | Rozsah | |---|---|---| | **byte** | 8 | **−128 až +127** | | **short** | 16 | **−32 768 až +32 767** | | **int** | 32 | **−2 147 483 648 až +2 147 483 647** | | **long** | 64 | **±9,2·10¹⁸** | #### Odčítání pomocí doplňkového kódu ==**Trik:** odčítat = sčítat zápornou hodnotu==. Příklad **7 − 3** (na 4 bitech): 1. Převedeme `−3`: - `3` = `0011` - inverze: `1100` - **+1** → `1101` (to je `−3` v doplňkovém kódu) 2. Sečteme `7 + (−3)` = `0111 + 1101`: ``` 0 1 1 1 + 1 1 0 1 ───────── 1 0 1 0 0 ← přenos do 5. bitu ``` 3. ==**Přenos do 5. bitu odřízneme**== (pracujeme na 4 bitech) 4. Výsledek = `0100` = **4** ✓ (`7 − 3 = 4`) ### Desetinná čísla #### S pevnou řádovou čárkou (fixed point) Desetinná čárka má ==**pevné místo**== — musíme předem vědět, kolik řádů chceme. Jednoduché, ale nepružné. #### S pohyblivou řádovou čárkou (floating point) ==**IEEE 754 standard**==. Číslo se ukládá jako: ==**A = m · Zᵉ**== (m = mantisa, e = exponent, Z = základ = 2) ##### Normalizace ==**Každé číslo lze zapsat nekonečně mnoha způsoby**== (např. 8 = 0,8·10¹ = 0,08·10² ...). Proto se používá ==**normalizovaný tvar**==: mantisu nelze posunout dál doleva. > [!example] Normalizace > `0,011 · 2³` — nenormalizovaný tvar > `1,100 · 2²` — ==**normalizovaný**== (mantisa začíná 1) ##### Skrytá jednička U normalizovaného čísla je ==**nejvyšší bit mantisy vždy 1**== → ==**nemusíme ho ukládat**== (získáme bit přesnosti zdarma). | Typ | Celkem | Znaménko | Exponent | Mantisa (uložená / efektivní) | |---|---|---|---|---| | ==**float (32 bit)**== | 32 b | 1 b | 8 b | 23 (24) b — ~7 dek. míst | | ==**double (64 bit)**== | 64 b | 1 b | 11 b | 52 (53) b — ~15 dek. míst | ### Reprezentace dat obecně - ==**Text**== — ASCII / UTF-8 - ==**Obraz**== — pole pixelů, každý RGB hodnoty - ==**Zvuk**== — vzorky digitalizovaného signálu (viz [[11 - Zvukova soustava PC|otázka 11]]) - ==**Video**== — sekvence obrazů (frames) + zvuk --- ## Shrnutí > [!summary] Co si pamatovat > **a) Soustavy:** ==**binární (2), dekadická (10), hex (16), oktal (8)**==. Hex pro adresy, MAC, barvy. Binární v PC kvůli 2 stavům elektroniky. > **b) Převody:** ==**dec→bin** dělením 2 (celá č.)==, ==**násobením 2 (desetinná č.)**==, ==**bin→dec** mocniny 2==, ==**bin↔hex** po 4 bitech==, ==**bin↔oct** po 3 bitech==. > **c) Aritmetika:** sčítání s **přenosem 1+1=10**, odčítání s výpůjčkou nebo ==**přes dvojkový doplněk**==. Hex: A=10, ..., F=15. > **d) Polyadický zápis:** ==**N = Σ aᵢ · Zⁱ**==. Číslo = součet číslic krát mocniny základu (i pro desetinné s Z⁻¹...). > **e) Kódování:** ==**BCD, Grayův kód**== (čísla); ==**ASCII (7 bit, 128 znaků)**==, CP1250 (česky), ==**Unicode / UTF-8 (web standard)**==. > **f) Reprezentace:** ==**int**== (přímý / inverzní / ==**doplňkový kód**==), ==**float / double (IEEE 754)**== — mantisa, exponent, normalizace, ==**skrytá jednička**==.