Algoritmy a datové struktury Data a datové typy 1 / 28
Obsah přednášky Základní datové typy Celá čísla Reálná čísla Znaky 2 / 28
Organizace dat Výběr vhodné datvé struktry různá paměťová náročnost různá časová náročnost Datová struktura data operace nad daty 3 / 28
Datové typy Data v počítači pomocí bitů Datové typy dávají bitům konkrétní význam Většina jazyků standardní sada typů celá čísla (integer) čísla s pohyblivou řádovou čárkou (floating point number) znaky (char) Pro datové typy jsou definovány operace výsledek operace nad konkrétním typem je konkrétního typu např. desetinné číslo / desetinné číslo = desetinné číslo 4 / 28
Datové typy Data v počítači pomocí bitů Datové typy dávají bitům konkrétní význam Většina jazyků standardní sada typů celá čísla (integer) čísla s pohyblivou řádovou čárkou (floating point number) znaky (char) Pro datové typy jsou definovány operace výsledek operace nad konkrétním typem je konkrétního typu např. desetinné číslo / desetinné číslo = desetinné číslo celé číslo / celé číslo = celé číslo 4 / 28
Datové typy Data v počítači pomocí bitů Datové typy dávají bitům konkrétní význam Většina jazyků standardní sada typů celá čísla (integer) čísla s pohyblivou řádovou čárkou (floating point number) znaky (char) Pro datové typy jsou definovány operace výsledek operace nad konkrétním typem je konkrétního typu např. desetinné číslo / desetinné číslo = desetinné číslo celé číslo / celé číslo = celé číslo zkuste si: System.out.println(5.0/2.0); 4 / 28
Datové typy Data v počítači pomocí bitů Datové typy dávají bitům konkrétní význam Většina jazyků standardní sada typů celá čísla (integer) čísla s pohyblivou řádovou čárkou (floating point number) znaky (char) Pro datové typy jsou definovány operace výsledek operace nad konkrétním typem je konkrétního typu např. desetinné číslo / desetinné číslo = desetinné číslo celé číslo / celé číslo = celé číslo zkuste si: System.out.println(5.0/2.0); System.out.println(5.0/2); 4 / 28
Datové typy Data v počítači pomocí bitů Datové typy dávají bitům konkrétní význam Většina jazyků standardní sada typů celá čísla (integer) čísla s pohyblivou řádovou čárkou (floating point number) znaky (char) Pro datové typy jsou definovány operace výsledek operace nad konkrétním typem je konkrétního typu např. desetinné číslo / desetinné číslo = desetinné číslo celé číslo / celé číslo = celé číslo zkuste si: System.out.println(5.0/2.0); System.out.println(5.0/2); System.out.println(5/2); 4 / 28
Datové typy Pro reprezentaci konkrétního datového typu pevný počet bitů závisí naplatformě nepsaný standard Typy 5 / 28
Datové typy Pro reprezentaci konkrétního datového typu pevný počet bitů závisí naplatformě nepsaný standard Typy celočíslené byte 8 bitů short 16 bitů int 32 bitů long 64 bitů 5 / 28
Datové typy Pro reprezentaci konkrétního datového typu pevný počet bitů závisí naplatformě nepsaný standard Typy celočíslené byte 8 bitů short 16 bitů int 32 bitů long 64 bitů pohyblivá čárka norma IEEE 754 float 32 bitů double 64 bitů 5 / 28
Datové typy Pro reprezentaci konkrétního datového typu pevný počet bitů závisí naplatformě nepsaný standard Typy celočíslené byte 8 bitů short 16 bitů int 32 bitů long 64 bitů pohyblivá čárka norma IEEE 754 float 32 bitů double 64 bitů znaky ne už tak standardní 8 bitů problém s národními znaky 16 bitů unicode 5 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b = 11 d 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b = 13 d 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b = 13 d 1100b 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b = 13 d 1100b = 12 d 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b = 13 d 1100b = 12 d 1011b 6 / 28
Dvojková soustava Výsledné číslo: c = a n 2 n + a n 1 2 n 1 + + a 0 2 0 Příklad: 100101 1 2 5 + 0 2 4 + 0 2 3 + 1 2 2 + 0 2 1 + 1 2 0 32 + 4 + 1 37 Zkuste si 1101 b = 13 d 1100b = 12 d 1011b = 11 d 6 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 0 b 10/2 = 5(0) 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 10 b 10/2 = 5(0) 5/2 = 2(1) 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) Zkuste si 15d 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) Zkuste si 15d = 1111 b 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) Zkuste si 15d = 1111 b 16d 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) Zkuste si 15d = 1111 b 16d = 10000 b 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) Zkuste si 15d = 1111 b 16d = 10000 b 17 d 7 / 28
Převod do dvojkové soustavy Postupně dělit číslo číslem dvě pokud je zbytek 1, zapsat 1 pokud je zbytek 0, zapsat 0 Příklad: číslo 10 d = 1010 b 10/2 = 5(0) 5/2 = 2(1) 2/2 = 1(0) 1/2 = 0(1) Zkuste si 15d = 1111 b 16d = 10000 b 17 d = 10001 b 7 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 128d 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 128d = 10000000 b 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 128d = 10000000 b = 80 h 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 128d = 10000000 b = 80 h 255 d 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 128d = 10000000 b = 80 h 255 d = 11111111 b 8 / 28
Převod do hexadecimální soustavy Z dvojkové soustavy seskupit bity do čtveřic každá čtveřice představuje jednu hexadecimální cifru Příklad 5d = 0000 0101 b = 05 h 15d = 0000 1111 b = 0F h 16 d = 0001 0000 b = 10 h Zkuste si 0d = 00000000 b = 00 h 128d = 10000000 b = 80 h 255 d = 11111111 b = FF h 8 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech = 2 60 2 4 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech = 2 60 2 4 = 6E = 18 446 744 073 709 551 616 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech = 2 60 2 4 = 6E = 18 446 744 073 709 551 616 Jaký je tedy rozsah? 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech = 2 60 2 4 = 6E = 18 446 744 073 709 551 616 Jaký je tedy rozsah? pro 8 bitů 0..255 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech = 2 60 2 4 = 6E = 18 446 744 073 709 551 616 Jaký je tedy rozsah? pro 8 bitů 0..255 pro 16 bitů 0..65355 9 / 28
Celá kladná čísla Jaké tedy mohou být rozsahy celých kladných čísel na 8 bitech = 2 8 = 256 na 16 bitech = 2 10 2 6 = 1024 64 = 64k = 65 536 na 32 bitech = 2 30 2 2 = 4G = 4 294 967 296 na 64 bitech = 2 60 2 4 = 6E = 18 446 744 073 709 551 616 Jaký je tedy rozsah? pro 8 bitů 0..255 pro 16 bitů 0..65355... 9 / 28
Celá čísla Co se zápornými čísly? přímý kód kód s posunutou nulou doplňkový kód inverzní kód Rozsah se zřejmě zmenší na polovinu 10 / 28
Přímý kód Nejvyšší bit (první z leva) určuje znaménko Zbytek čísla je normální dvojkové číslo Nula lze teoreticky zapsat dvěma způsoby (+0, -0) Příklad 5 d = 00000101 b 5 d = 10000101 b Rozsah 1 1111111b = 127 d 0 1111111 b = 127 d 11 / 28
Kód s posunutou nulou K výslednému číslu se přičte hodnota Většinou polovina rozsahu Příklad 0d = 0 + 127 = 01111111 b 5d = 5 + 127 = 10000100 b 5 d = 5 + 127 = 01111010 b Rozsah 11111111b = 255 127 = 128 d 00000000b = 0 127 = 127 d 12 / 28
Inverzní kód Kladná čísla beze změny Nekladná doplněk do nejvyššího čísla lze vyrobit bitovou inverzí Příklad 0d = 00000000 b 5d = 00000101 b 0d = 11111111 b 5d = 11111010 b Rozsah 127d = 10000000 b 127d = 01111111 b 13 / 28
Doplňkový kód Kladná čísla beze změny Nekladná doplněk do nejvyššího čísla +1 lze vyrobit bitovou inverzí a přičíst 1 Příklad 0d = 00000000 b 5d = 00000101 b 5d = 11111011 b Rozsah 128d = 10000000 b 127d = 01111111 b 14 / 28
Zkuste si Pomocí funkce DataOutputStream.writeByte zapsat do souboru několik různých hodnot Pomocí hexadecimálního prohlížeče si čísla prohlédnout http://www.simdesign.nl/binview.html Zjistěte maximální číslo minimální číslo jak lze zapsat 0 jaké kódování se používá 15 / 28
Semilogaritmický tvar Vyjádření čísla: X = m z e m mantisa; přesnost čísla z základ exponentu; v počítači je 2 e exponent; rozsah čísla Příklad 3.1415 = 0.31415 10 1 = 314.15 10 2 0.0004 = 0.4 10 3... 16 / 28
Semilogaritmický tvar Normalizovaný tvar mantisy mantisa musí být 1 m < z odstaňuje nejednoznačnosti v zápisu Vyjádřitelná čísla např. mantisa 3 řády a znaménko exponent 2 řády a znaménko základ 10-9.99e2-9.99e-2 0 9.99e-2 9.99e2 17 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0. b 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.1 0.6 2 = 1.2(1) b 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) b 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.100 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) b 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.1001 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) Zkuste si 0.5 d 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) Zkuste si 0.5 d = 0.1 b 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) Zkuste si 0.5 d = 0.1 b 0.625 d 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) Zkuste si 0.5 d = 0.1 b 0.625 d = 0.101 b 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) Zkuste si 0.5 d = 0.1 b 0.625 d = 0.101 b 1.75d 18 / 28
Jak to je s desetinným binárním číslem? Podobně jako s celým jednotlivé řády i označují násobky 2 i Převod číslo postupně násobíme 2 když je výsledek menší než 1, napíšeme 0 jinak odečteme 1 a napíšeme 1 Příklad: číslo 0.6 d = 0.10011 b 0.6 2 = 1.2(1) 0.2 2 = 0.4(0) 0.4 2 = 0.8(0) 0.8 2 = 1.6(1) 0.6 2 = 1.2(1) Zkuste si 0.5 d = 0.1 b 0.625 d = 0.101 b 1.75d = 1.11 b 18 / 28
Počítačový zápis IEEE standard základ 2 exponent kód s posunutou nulou mantisa přímý kód (znaménko oddělené) jednoduchá přesnost 32 bitů (8 bitů exponent, 23 bitů mantisa) dvojitá přesnost 64 bitů (11 bitů exponent, 52 bitů mantisa) Normování mantisy první nenulový bit před desetinnou tečku (nepíše se) příklad: 0.0101.01 +/- exponent mantisa 31 30 23 22 0 +/- exponent mantisa 63 62 52 51 0 19 / 28
Rozsah reálných čísel Rozsah v jednoduché přesnosti (float) ±10 45 až ±10 3 9 s přesností na 6 míst Rozsah v dvojité přesnosti (double) s přesností na 15 ±10 323 až ±10 3 08 20 / 28
Zkuste si Pomocí funkce DataOutputStream.writeFloat zapsat do souboru několik různých hodnot Pomocí hexadecimálního prohlížeče si čísla prohlédnout http://www.simdesign.nl/binview.html Zjistěte maximální číslo minimální číslo jak lze zapsat 0 Podívejte se na http://www.h-schmidt.net/floatapplet/ieee754.html 21 / 28
Kódování znaků 8 bitů Při použití 1 byte jsou jednotlivé znaky uloženy v tabulce Nejznámější norma ASCII (American Standard Code for International Interchange) prvních 127 znaků číslice, písmena anglické abecedy, matematické symboly, řídící znaky,... zbytek obsahuje rámečky, akcentovaná písmena,... Národní znaky a jiné radosti umisťují se od 127 výš nelze zachovat všechny znaky 22 / 28
Ascii tabulka 23 / 28
Nešťastná čeština mnoho různých kódování iso-8859-2, cp1250,... nutnost znát kódování v kterém byl text napsán ve windows 1250: cp1250 (windows): Příliš žluťoučký kůň úpěl ďábelské ódy iso-8859-2 (linux): Přília ľluoučký kůň úpěl ďábelské ódy cp852 (dos): Pýˇliç luśouźkě kĺ LpŘl Ô belsk dy 24 / 28
Kódování znaků 16 bitů Unicode 256 2 = 65536 nejnovější norma dokonce 31 bitů přes 2 miliardy znaků Lze zobrazovat všechny znaky najednou Text zabírá dvojnásobek místa Většina evropských znaků se nachází ve spodní části kódování UTF-8 různá délka znaku od 1 do 3 bytů 25 / 28
Zkuste si Pomocí funkce DataOutputStream.writeChar zapsat do souboru několik různých znaků Pomocí hexadecimálního prohlížeče si znaky prohlédnout http://www.simdesign.nl/binview.html Zjistěte jaké kódování používá java jaké kódy odpovídají znakům české abecedy 26 / 28
Konec 27 / 28
Konec 28 / 28