1. Seznámení s učebnou, a základy reprezentace dat

Osnova cvičení

  1. požadavky na zápočet, hodnocení
  2. seznámení s učebnou
  3. 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?
  1. K přihlášení v KN:E-23 se používá hlavní přístupové heslo ČVUT (více o heslech)
  2. základní terminálové příkazy ( základní UNIXové příkazy)
  3. binární a hexadecimální reprezentace celých čísel
  4. bitové operace s čísly (and, or, posuny, rotace, …)
  5. kapitolu 3 z 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

Domácí úkoly

Co Vás tento semestr čeká:

  • 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/
  • 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 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 <stdio.h>
 
/*
 * 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 geany nebo vim.

Úkoly

  1. 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.
  2. 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)
  3. 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?
  4. Čí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ě
  5. Čí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 <math.h>
      • 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.
  6. 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í
  1. operace sčítání, odčítání, násobení a dělení
  2. logické operace s binárními čísly (and, or, rotace, …)
  3. přečíst/zopakovat znalosti z APOLOS
  4. reprezentace reálných čísel (IEEE 754)

Užitečné odkazy

courses/b35apo/tutorials/01/start.txt · Last modified: 2026/02/15 22:07 by stepan