Obsah

Celá čísla

Viz též heslo Dvojková soustava na Wikipedii.

Pro práci s celými čísly jsou v Javě typy byte, short, int a long. Všechny jsou znaménkové (připouštějí záporné hodnoty) a všechny používají doplňkový kód. Doplňkový kód definuje, jak jsou číselné hodnoty uloženy v paměti. Celočíselné typy se navzájem liší rozsahem přípustných hodnot. Přípustné hodnoty pro daný typ jsou dány počtem bajtů, které jsou potřeba pro uložení hodnoty tohoto typu. Např. typ byte je definován jako jednobajtový a jeho přípustné hodnoty jsou v rozmezí <-128, 127>. Celočíselné typy

Pro objasnění principu doplňkového kódu si popíšeme, jak by vypadal čtyřbitový celočíselný typ. Přípustné hodnoty jsou určeny tím, že k uložení hodnoty tohoto typu máme k dispozici pouze čtyři bity. Čtyři bity připouštějí 16 kombinací nul a jedniček: 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111. Každá tato kombinace bude obrazem jedné přípustné hodnoty. Kombinace, které mají v nejvyšším bitu (tj. prvním zleva) nulu, použijeme pro kladná čísla a nulu. Doplňkový kód Kombinace, které mají v nejvyšším bitu jedničku, budou zobrazovat čísla záporná. Doplňkový kód Z toho plyne, že interval přípustných hodnot bude <-8, 7>. Obecně při použití k bitů je interval přípustných hodnot <-2k-1, 2k-1-1>. Zbývá přiřadit každé přípustné hodnotě jednu z 16 kombinací nul a jedniček. Nezáporným číslům přiřadíme jejich zápis ve dvojkové soustavě. Např. číslo 5 bude uloženo jako 0101. Záporným číslům přiřadíme dvojkový zápis jejich doplňku do hodnoty 2k, kde k je počet bitů. Např. pro číslo −5 je tento doplněk −5 + 16 = 11. Hodnota −5 bude tudíž uložena jako 1011.

Sčítání v doplňkovém kódu Doplňkový kód má několik příjemných vlastností. Např. sečtení dvou čísel v doplňkovém kódu provedeme tak, že sečteme jejich obrazy. Vznikne-li přenos z nejvyššího řádu, budeme jej ignorovat. Stane-li se, že výsledek operace neleží v přípustném intervalu, nastává přetečení (angl. overflow): 0110 + 0011 = 1001, 6 + 3 = −7. V takovém případě má výsledek opačné znaménko než výsledek matematické operace.

V Javě nezpůsobí přetečení chybu, je však třeba s ním počítat. Např. pokud máme v proměnné typu byte hodnotu 127 a přičteme k ní 1, bude v proměnné −128. Přetečení

Zápis celočíselné hodnoty lze v Javě provést několika způsoby:

Úloha 1

Spárujte hodnoty a jejich binární obrazy.

Úloha 2

Spárujte stejné hodnoty.

Úloha 3

Magický čtverec je čtverec o velikosti strany n, který obsahuje čísla 1..n2 a pro který platí, že součet čísel v každém řádku, sloupci i na diagonálách je stejný. Doplňte magický čtverec tak, aby byl součet v každém řádku, sloupci i na diagonálách 34.

Úloha 4

Doplňte věty.

Otázky a odpovědi

Studentka: Mistře, proč se používá „složitý“ doplňkový kód, když by stačilo ukládat čísla jako dvojici znaménko a absolutní hodnota? Pro uložení znaménka nám stačí jeden bit. Kladné znaménko bychom uložili jako nulu a záporné jako jedničku. Pak by např. číslo 6 bylo ve čtyřbitovém kódu uloženo jako 0110 a číslo −6 jako 1110.
Java guru: Tato reprezentace celých čísel se také někdy používá. Říká se jí přímý kód. Oproti doplňkovému kódu má dvě nevýhody: nula má dva obrazy (0000 a 1000) a operace s čísly jsou malinko složitější. Proto se většinou dává přednost doplňkovému kódu.
Studentka: Pro uložení hodnoty typu byte potřebujeme 1 bajt a pro uložení hodnoty typu int potřebujeme 4 bajty. Znamená to, že proměnná typu int zabírá stejně místa jako čtyři proměnné typu byte, mistře?
Java guru: Ne. Pro proměnné v zásobníku platí, že každá zabírá nejméně 4 bajty. Proměnná typu byte tedy zabírá v JVM stejně paměti jako proměnná typu short nebo int, a to 4 bajty. Proměnná typu long zabírá dvakrát více místa, tj. 8 bajtů.