# 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**==.