Přednáška http://efis.tul.cz/~dana.nejedlova/ Základy programování, Programování I a II Přednáška - Čísla v počítači Cisla_v_pocitaci.pptx Probralo se to do snímku "Reálná čísla" - "Co je třeba umět do testu". Ke zkoušce je třeba znát: - Převést konkrétní celé číslo na jeho dvojkový doplněk. - Jaké chyby vznikají při výpočtech s celými čísly? - Přetečení nebo podtečení. - Jaké chyby vznikají při výpočtech s reálnými čísly? - Ztráta přesnosti. - Jaká část formátu IEEE 754 určuje - rozsah čísla a - Exponent - přesnost čísla? - Mantisa - Rozpoznat, zda je dané reálné číslo v desítkové soustavě reprezentovatelné v počítači ve formátu IEEE 754 bez ztráty přesnosti. - Jak se liší rozdíl mezi sousedními možnými hodnotami čísla ve formátu IEEE 754 od čísla ve formátu dvojkového doplňku? - Ve formátu IEEE 754 může být různý. Ve formátu dvojkového doplňku se sousední čísla liší o jednu. Cvičení http://efis.tul.cz/~dana.nejedlova/ Základy programování, Programování I a II Návod na instalaci vývojového prostředí CodeBlocks a první kroky v něm http://efis.tul.cz/~dana.nejedlova/C/MinGW_CodeBlocks.html 4. Ladění programu v prostředí CodeBlocks Vývojové prostředí CodeBlocks - ladění programu krokováním Přetečení a podtečení #include int a = 1000; int main(void) { int b; char c; for (b = 0; b < a; b++) { c = b; printf("%d ", c); } return 0; } Tento program vypisuje opakovaně čísla 0 až 127 a po nich čísla -128 až -1. Na programátorské kalkulačce Windows bylo vysvětleno, proč je 127 + 1 = -128. #include int a = 1000; int main(void) { int b; char c; for (b = 0; b < a; b++) { c = b; printf("%u ", c); } return 0; } Tento program vypisuje opakovaně čísla 0 až 127 a po nich čísla 4294967168 až 4294967295. Na windowsovké kalkulačce nastavte Qword (64 bitů). Vložte do ní číslo 4294967168 a potom přepněte na Dword (32 bitů) a číslo se změní na -128. V 32 bitech je nejvyšší řádový bit rovný 1 a proto se číslo do desítkové soustavy převede podle pravidel dvojkového doplňku jako záporné. Na windowsovké kalkulačce nastavte Qword (64 bitů). Vložte do ní číslo 4294967295 a potom přepněte na Dword (32 bitů) a číslo se změní na -1. Datový typ char je na použité platformě znaménkový, a proto se jeho bity převádějí do desítkové soustavy podle pravidel dvojkového doplňku. Řídící řetězec formátu "%u" vypisuje proměnnou neznaménkově, tedy podle matematických pravidel převodu z binární do desítkové soustavy. 128, v bitech 1000 0000, se na použité platformě, protože je proměnná c znaménková, uloží do 32 bitů jako -128. Toto chování je pravděpodobně závislé na platformě, viz https://stackoverflow.com/questions/51047929/assigning-128-to-char-variable-in-c/51048273 Znaménkový datový typ se nemá vypisovat pomocí řídícího řetězce formátu "%u". #include int a = 1000; int main(void) { int b; unsigned char c; for (b = 0; b < a; b++) { c = b; printf("%u ", c); } return 0; } Tento program vypisuje opakovaně čísla 0 až 255. Když přičteme k číslo 255 jedničku, dojde u jednobajtového datového typu k přetečení. #include int a = -1000; int main(void) { int b; char c; for (b = 0; b > a; b--) { c = b; printf("%d ", c); } return 0; } Tento program vypisuje opakovaně čísla 0, -1 až -128 a po nich čísla 127 až 1. Když odečteme od čísla -128 jedničku, dojde u jednobajtového datového typu k podtečení. #include int a = 1000; int main(void) { char b; /* Zde byl puvodne int. */ char c; for (b = 0; b < a; b++) { c = b; printf("%d ", c); } return 0; } #include int a = 1000; /* Pro 255 nebo mene se program nezacykli. */ int main(void) { unsigned char b; /* Zde byl puvodne int. */ char c; for (b = 0; b < a; b++) { c = b; printf("%d ", c); } return 0; } Tento program se zacyklí, protože proměnná b nemůže být rovna nebo vyšší než 1000. Proměnná b je typu unsigned char a datový typ char je vždy jednobajtový, má tedy 8 bitů. Hodnota uložená v 8 bitech může mít hodnotu od 0000 0000 do 1111 1111 tedy v desítkové soustavě neznaménkově od 0 do 255.