====== Číselné soustavy ====== Číselné soustavy se v digitální technice používají pro reprezentaci a zpracování informací. Nejčastěji se setkáváme s těmito soustavami: * **binární (2)** – základní soustava v digitální technice * **desítková (10)** – běžná soustava pro člověka * **šestnáctková (16)** – zkrácený zápis binárních čísel ===== Základní přehled ===== ^ Soustava ^ Základ ^ Používané symboly ^ | Binární | 2 | 0, 1 | | Desítková| 10 | 0–9 | | Hexadecimální | 16 | 0–9, A–F | ===== Převody mezi soustavami ===== ==== Binární → Desítková ==== Každá číslice (bit) má váhu mocniny 2: Např.: * $1011_2 = 1·2^3 + 0·2^2 + 1·2^1 + 1·2^0 = 11_{10}$ ==== Desítková → Binární ==== Postupné dělení dvěma: * 13 ÷ 2 = 6 zbytek 1 * 6 ÷ 2 = 3 zbytek 0 * 3 ÷ 2 = 1 zbytek 1 * 1 ÷ 2 = 0 zbytek 1 Výsledek čteme odzadu: * $13_{10} = 1101_2$ ==== Binární ↔ Hexadecimální ==== Převod probíhá po čtveřicích bitů: ^ Bin ^ Hex ^ ^ Bin ^ Hex ^ | 0000 | 0 | | 1000 | 8 | | 0001 | 1 | | 1001 | 9 | | 0010 | 2 | | 1010 | A | | 0011 | 3 | | 1011 | B | | 0100 | 4 | | 1100 | C | | 0101 | 5 | | 1101 | D | | 0110 | 6 | | 1110 | E | | 0111 | 7 | | 1111 | F | Např.: * $1011\ 0110_2 = B6_{16}$ ===== Záporná čísla ===== Záporná čísla se v digitální technice reprezentují pomocí **dvojkového doplňku**. Postup: 1. zapíšeme číslo v binární podobě 2. invertujeme bity (0 ↔ 1) 3. přičteme 1 Např.: * $5_{10} = 0101_2$ * inverze → 1010 * +1 → **1011 = -5** ===== BCD kód ===== BCD (Binary Coded Decimal) reprezentuje každou desítkovou číslici samostatně pomocí 4 bitů. ^ Dec ^ BCD ^ | 0 | 0000 | | 1 | 0001 | | 2 | 0010 | | 3 | 0011 | | 4 | 0100 | | 5 | 0101 | | 6 | 0110 | | 7 | 0111 | | 8 | 1000 | | 9 | 1001 | Použití: * 7segmentové displeje * jednoduché zobrazování čísel ===== Přetečení (overflow) ===== K přetečení dochází, pokud výsledek operace nelze reprezentovat daným počtem bitů. Např. pro 4 bity: * $1111_2 + 1 = 1\ 0000_2$ → přetečení Přebytečná „jednička“ vlevo představuje tzv. **příznak přenosu (carry)**. Tento příznak: * indikuje přenos mimo rozsah registru * ukládá se do stavového registru procesoru (např. **Program Status Register**) * označuje se jako **carry bit (C)** ===== Carry vs. Overflow ===== V digitálních systémech je důležité rozlišovat dva různé příznaky: ==== Carry (C) ==== * používá se pro **neznaménková čísla (unsigned)** * značí přenos mimo rozsah (např. 255 + 1 u 8 bitů) * sleduje „fyzické“ přetečení bitů ==== Overflow (V) ==== * používá se pro **znaménková čísla (signed, dvojkový doplněk)** * značí, že výsledek **nedává správný matematický smysl** * vzniká, když: - sečtou se dvě kladná čísla a výsledek je záporný - nebo dvě záporná a výsledek je kladný Příklad (4 bity, signed): * $0111_2 (7) + 0001_2 (1) = 1000_2 (-8)$ → overflow ===== Rychlé tipy ===== * 1 hex cifra = **4 bity** * 1 byte = **8 bitů = 2 hex cifry** * binární čísla se dobře čtou po **4 bitech (nibble)** * mocniny 2: 1, 2, 4, 8, 16, 32, 64, 128, ... ===== Zápis čísel v jazyce C ===== V programovacím jazyce C lze zapisovat čísla v různých soustavách pomocí specifických prefixů: ^ Soustava ^ Zápis v C ^ Příklad ^ Hodnota ^ | Desítková | bez prefixu | 10 | 10 | | Binární((Binární zápis (''0b...'') není součástí standardu jazyka C. Je podporován pouze některými překladači (např. GCC, Clang) jako rozšíření. V přenosném C se proto používá hexadecimální zápis (''0x...'') nebo bitové operace.)) | 0b | 0b1010 | 10 | | Hexadecimální | 0x | 0x0A | 10 | ==== Příklady ==== int a = 10; // desítkově int b = 0b1010; // binárně int d = 0xA; // hexadecimálně