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>.
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.
Kombinace, které mají
v nejvyšším bitu jedničku, budou zobrazovat čísla záporná.
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.
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.
Zápis celočíselné hodnoty lze v Javě provést několika způsoby:
desítkově: např. 123
šestnáctkově: zápis začíná znaky 0x nebo 0X, např. 0x2A, 0xff
(lze používat malá i velká písmena)
osmičkově: zápis začíná znakem 0, např. 012 je desítkově 10
dvojkově: zápis začíná znaky 0b, např. 0b1000 je desítkově 8
Ú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ů.