Notice
This page is located in a preparation section.

Číselné soustavy a reprezentace čísel

Čí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
  • osmičková (8) – také označována jako oktalová
  • desítková (10) – běžná soustava pro člověka
  • šestnáctková (16) – zkrácený zápis binárních čísel

V následujícím textu uvažujeme pouze celá čísla (anglicky integer). Celá čísla dále rozlišujeme bez znaménka, která nabývají nezáporných hodnot, a znaménková (signed), která mohou nabývat i záporných hodnot.

Základní přehled

Obecně je celé číslo bez znaménka $c$ zapsáno pomocí mocnin základu soustavy $d$ $$c = \sum_{i=0}^{n-1} a_i \cdot d^i$$, kde $n$ je řád čísla (velikost) a $a_i$ nabývá některé z povolených hodnot. Například číslo 134 v desítkové soustavě se pomocí základu rozepíše jako $134 = 1\cdot 10^2 + 3\cdot 10^1 + 4\cdot 10^0$, takže koeficienty $a_i$ jsou $a_2 = 1, a_1 = 3, a_0 = 4$. V případě dvojkové soustavy udává $n$ bitovou velikost čísla, tedy kolik bitů je třeba k jeho reprezentaci. Pokud je tedy proměnná 8-bitová ($n=8$), pak dokáže uchovat čísla od 0 do 255 ($a_i = 1$, vyzkoušejte si to).

Soustava Základ Používané symboly Hodnoty symbolů
Binární 2 0, 1 0, 1
Osmičková (oktalová) 8 0–7 0–7
Desítková 10 0–9 0–9
Hexadecimální 16 0–9, A–F 0–15

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}$

Reprezentace čísel se znaménkem (záporná čísla)

Celá čísla se znaménkem (anglicky signed integer) lze reprezentovat pomocí například pomocí:

  • přímého kódu,
  • jednotkového doplňku (one's complement),
  • dvojkového doplňku (two's complement).

V digitální technice (a tedy i v procesorech) se znaménková čísla reprezentují pomocí dvojkového doplňku. Nicméně i s dalšími reprezentacemi se často setkáváme například u dat z různých senzorů.

Přímý kód

V přímém kódu je znaménku vyhrazen jeden bit z čísla. Pokud je číslo 8-bitové, pak je nejvyšší bit znaménkový a zbylých 7 slouží k reprezentaci čísla. V tomto případě lze uložit čísla od $0$ do $127$, když je znaménkový bit roven 0 a čísla $-0$ do $-127$, pokud je znaménkový bit roven 1. Jak je vidět, přímý kód reprezentuje 0 dvakrát, jednou se znaménkem a jednou bez. Ztrácíme tak možnost reprezentovat jedno další číslo a hardware pracující v přímém kódu je složitější, protože musí kontrolovat tento případ. Dalším problémem je, že výsledek součtu dvou čísel stejné velikost ale jiného znaménka (například $56$ a $-56$) není nula, což dál komplikuje návrh hardware.

Jednotkový doplněk

Jednotkový doplněk reprezentuje záporná čísla bitovou inverzí jejich kladného protějšku. Například pro reprezentaci čísla $-56$ vezmeme část bez znaménka $56 = 111000_2$ a nyní bity invertujeme a získáme reprezentaci čísla $-56$ v jednotkovém doplňku $-56 = 11000111_2$. I zde je problém, podobně jako u přímého kódu, s dvojitou reprezentací 0 a že součet $56 + (-56)$ není roven 0.

Dvojkový doplněk

Dvojkový doplněk je rozšíření jednotkového doplňku, jen se přidá přičtení 1. Záporné číslo se získá inverzí bitů a přičtením čísla 1.

Postup pro zapsání $-56$:

  1. zapíšeme číslo $-56$ bez znaménka v binární podobě ($56 = 111000_2$),
  2. invertujeme bity (0 ↔ 1) ($111000_2 = 11000111_2$),
  3. přičteme číslo $1$ ($11000111_2 + 1_2 = 11001000_2 = -56$).

Dvojkový doplněk má jedinou (unikátní) reprezentaci čísla 0 (zkuste si postup uvedený výše pro číslo 0). Dále konečně platí, že $56 + (-56) = 0$, tedy $111000_2 + 11001000_2 = 00000000_2$.

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ž:
    1. sečtou se dvě kladná čísla a výsledek je záporný
    2. 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í1) 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ě

1)
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.
courses/amp_mam/tutorials/number_representation.txt · Last modified: 2026/08/11 13:51 by krskajo1