====== 1. Seznámení s učebnou, a základy reprezentace dat ======
* pro vyučující: [[..:..:internal:tutorials:01:start|cvičení 1]]
===== Osnova cvičení =====
- požadavky na zápočet, hodnocení
- seznámení s učebnou
- opakování PSY
* reprezentace záporných čísel
* dvojková, desítková a šestnácková soustava
* little endian / big endian
* čísla s pevnou desetinnou čárkou
* základní bitové operace s čísly (masky - bitový and, or; posuny operátory <<, >>)
**Co bych si měl na první cvičení zopakovat / připravit?**
- K přihlášení v KN:E-23 se používá **hlavní přístupové heslo ČVUT** ([[https://support.dce.felk.cvut.cz/mediawiki/index.php/Hesla_a_jejich_spr%C3%A1va_na_%C4%8CVUT/FEL|více o heslech]])
- základní terminálové příkazy ([[https://osy.pages.fel.cvut.cz/docs/cviceni/lab1/commands/ | základní UNIXové příkazy]])
- binární a hexadecimální reprezentace celých čísel
- bitové operace s čísly (and, or, posuny, rotace, ...)
- kapitolu 3 z {{ ..:..:lectures:apolos_v11.pdf|APOLOS}} - binární soustava a modulo aritmentika
===== Náplň cvičení =====
Cílem cvičení je seznámení s učebnou, zopakování základních pojmů na téma reprezentace dat v počítači
==== Počítačová učebna ====
* [[courses:b35apo:documentation:classroom|Učebna KN-23]]
* [[courses:b35apo:documentation:remote:start|Vzdálený přístup]]
* V případě problémů s instalací kontaktuje Aleše Kapicu ze skupiny IT (http://support.dce.felk.cvut.cz/mediawiki/index.php/IT_kontakty) případně další kolegy ze skupiny IT, kteří mají správu hardware a sítí na starosti.
**Terminálové příkazy**
* [[https://osy.pages.fel.cvut.cz/docs/cviceni/lab1/commands/|Základní přehled terminálových příkazů (B4B35OSY)]].
* [[https://bootlin.com/doc/legacy/command-line/command_memento.pdf|Podrobnější jednostránkový přehled]] a [[https://bootlin.com/doc/legacy/command-line/unix_linux_introduction.pdf|prezentace]] ze stránek [[https://bootlin.com/|Bootlin]]
==== Domácí úkoly ====
Co Vás tento semestr čeká:
* [[..:..:homeworks:start|domácí úkoly]] 1 až 4 budou zadané a odevzdávané elektronickou formou
* vstup k zadání a odevzdání úkolů 1 a 3 je přes adresu [[https://dcenet.fel.cvut.cz/apo/|https://dcenet.fel.cvut.cz/apo/]]
* Na stránce "Assignments" naleznete seznam zadaných úkolů
* Pro vyzkoušení práce s odevzdávacím systémem je k dispozici nehodnocená varianta prvního úkolu **1st training homework**
* Případnými problémy s odevzdávacím systémem se obracejte na svého cvičícího nebo u úkolů 1 a 3 přímo na autora/správce sytému [[courses:b35apo:teacher:susta:start|Richarda Šustu]]
==== Reprezentace čísel v paměti ====
Na cvičení budeme vycházet z následujícího programu v C, který budeme dále modifikovat.
Program pro zobrazování reprezentace čísel v paměti:
/* Simple program to examine how are different data types encoded in memory */
#include
/*
* The macro determines size of given variable and then
* prints individual bytes of the value representation
*/
#define PRINT_MEM(a) print_mem((unsigned char*)&(a), sizeof(a))
void print_mem(unsigned char *ptr, int size) {
int i;
printf("address = 0x%016lx\n", (long unsigned int)ptr);
for (i = 0; i < size; i++) {
printf("0x%02x ", *(ptr+i)); // == printf("0x%02x ", ptr[i]);
}
printf("\n");
}
int main() {
/* try for more types: long, float, double, pointer */
unsigned int unsig = 5;
int sig = -5;
/* Read GNU C Library manual for conversion syntax for other types */
/* https://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html */
printf("value = %d\n", unsig);
PRINT_MEM(unsig);
printf("\nvalue = %d\n", sig);
PRINT_MEM(sig);
return 0;
}
Zdojový kód programu je z počítačů v laboratoři možné zkopírovat z adresáře ''/opt/apo/binrep/print_binrep''.
K překladu programu použijte buď přímo příkaz:
gcc -Wall -pedantic -o print_binrep ./print_binrep.c
nebo přiložený soubor s popisem sestavení (''Makefile'') pro program 'make'.
K editaci použijte některý z nainstalovaných editorů (geany, vim, emacs, qtcreator, ...) nebo prostředí VS-Codium - open source verze VS-Code.
Pro ty, co nemají vlastní preferenci je vhodné začít třeba s programem [[https://www.geany.org/|geany]] nebo [[https://www.vim.org/|vim]].
===== Úkoly =====
- **Vyzkoušejte si ručně sčítání a odčítání celých čísel v doplňkovém kódu**
* uveďte, jak bude vypadat 8-mi bitová reprezentace čísla ''-14'' v dvojkové soustavě, v hexadecimální soustavě
* uveďte, jak bude vypadat 16 a 32 bitová reprezentace čísla ''-14'' v hexadecimální soustavě
* demonstrujte výpočet např. ''28-14'' jako součet čísla ''28'' a ''-14'' ve dvojkové soustavě
* ověřte, zda výpočet např. ''10-14'' spočtený jako součet čísla ''10'' a ''-14'' dává správný výsledek
* kdy může dojít k přetečení a jak poznáte, že k němu došlo?
* Najděte dvě 8 bitová čísla, jejichž součet se nevejde do 8 bitové reprezentace a ověřte, jak počítač tyto čísla sečte.
* Zkuste najít dvě záporná 8 bitová čísla, jejichž součet se nevejde do 8 bitové reprezentace.
- **Násobení celých čísel**
* demonstrujte výpočet např. ''7*6''
* jak se výpočet změní v případě záporných čísel? např. ''-7*6, -7*(-6), 7*(-6)''
- **Dělení celých čísel**
* demonstrujte výpočet např. ''42/7, 43/7''
* jak se výpočet změní v případě záporných čísel?
- ** Čísla s pevnou řádovou čárkou **
* Uvažujte 16 bitová čísla s pevným počtem 8 bitů za řádovou čárkou
* Jak bude vypadat reprezentace čísel ''5,25'' a ''0,1'' jako celé číslo bez znaménka v desítkové a šestnáctkové - hexadecimální soustavě
* Sečtěte tato čísla v desítkové soustavě a výsledek převeďte na reprezentaci reálného čísla v desítkové soustavě
* Vynásobte tato čísla v desítkové soustavě a výsledek převeďte na reprezentaci reálného čísla v desítkové soustavě
* Vydělte tato čísla v desítkové soustavě a výsledek převeďte na reprezentaci reálného čísla v desítkové soustavě
- ** Čísla s pohyblivou řádovou čárkou - float, double **
* V programu binrep zjistěte, jak je uloženo číslo ''2.5''
* Určete jak vypadá znaménko, exponent a mantisa tohoto čísla
* Stejné zjistěte pro číslo ''-31,75'', ''3.67342e-40''. Jaký je zásadní rodíl mezi těmito dvěma čísly (nemyslíme tím znaménko čísla)
* pro tisk čísel využijte formát ''%e'', tedy ''printf("value = %e\n", a);''
* Zjistěte jak je uloženo číslo ''float a = 2e38;'' a číslo ''float b = 2 * a;''
* Zjistěte co dělá makro ''INFINITY'' ze souboru ''#include ''
* zkuste program ''float inf = INFINITY;''
* Najděte číslo ''double x;'' takové, aby jeho násobek dvěmi byl nekonečno.
* Nápověda, čísla typu double mají 11-bitů na exponent s nulou posunutou o 1023.
- **Studenti se pokusí upravit program binrep tak:**
* aby vypisoval výsledek po jednotlivých bitech od bitu číslo ''31'' po bit ''0''
* pro datové typy s menším rozsahem (short int, unsigned short int, unsigned char, signed char) od nejvýznamnějšího bitu po nejméně významný bit.
* aby pro čísla typu float uměl vytisknout znaménko, exponent a mantisu i s případnou skrytou jedničkou.
**Co si zopakovat na druhé cvičení**
- operace sčítání, odčítání, násobení a dělení
- logické operace s binárními čísly (and, or, rotace, ...)
- přečíst/zopakovat znalosti z {{ ..:..:lectures:apolos_v11.pdf|APOLOS}}
- reprezentace reálných čísel ([[https://en.wikipedia.org/wiki/IEEE_754|IEEE 754]])
===== Užitečné odkazy =====
* [[https://comparch.edu.cvut.cz/|Stránky s online verzí simulátoru QtRvSim a souvisejícími materiály]]
* [[https://fosdem.org/2023/schedule/event/rv_qtrvsim/|představení rozhraní a použití simulátoru QtRvSim na konferenci FOSDEM panem Dupákem]]
* [[https://support.dce.felk.cvut.cz/pos/cv1/|https://support.dce.felk.cvut.cz/pos/cv1/]] - Práce v příkazové řádce POSIXového systému, kompilace a její automatizace (make)
* [[http://support.dce.felk.cvut.cz/pos/cv-langc/|http://support.dce.felk.cvut.cz/pos/cv-langc/]] - Základy jazyka C
* [[http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html|http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html]] - Dokumentace k řízení formátovaného výstupu pro implementaci **printf** z knihovny funkcí pro jazyk C ([[http://www.gnu.org/software/libc/|GLIBC]]) z projektu [[http://www.gnu.org/|GNU]]
* [[https://bootlin.com/doc/legacy/command-line/command_memento.pdf|Základní příkazy pro práci v příkazové řádce]] ([[https://bootlin.com/doc/legacy/command-line/unix_linux_introduction.pdf|prezentace]]) na [[https://bootlin.com/|Bootlin]]