4. Reprezentace čísel v C

Reprezentace celých čísel v jazyce C #

Osnova cvičení #

  • poziční číselné soustavy a převod mezi nimy
  • aritmetické operace v binární soustavě
  • čísla v paměti a endianita
  • bitové operace

Úkoly #

  1. Převeďte čísla 42 a -57

    • do dvojkové soustavy jako typ uint8_t a int8_t
    • do šestnáctkové soustavy jako typ uint32_t a int32_t.
  2. Převeďte číslo 0b10101010

    • do desítkové soustavy jako typ uint16_t a int16_t.
    • do šestnáctkové soustavy jako typ uint8_t a int8_t.
  3. Převeďte číslo 0xAF do binární soustavy jako typ uint8_t a int8_t.

  4. Vyzkoušejte si ručně sčítání a odčítání celých čísel v doplňkovém kódu

    • demonstrujte výpočet např. 7+6, 7-6
    • procvičte výpočet na dalších číslech a s pomocí programu výsledky ověřte
    • Kdy může dojít k přetečení a jak poznáte, že k němu došlo?
  5. 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)
  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?
    • jak získáte zbytek po dělení?
    • Dokážete v některých případech provést dělení rychleji?
  7. Napište program v jazyce C, který pomocí bitových operací vypíše

    • jednotlivé bity čísla od nejnižšího po nejvyšší.
    • jednotlivé bity čísla od nejvyššího po nejnižší.
    • (bonus) číslo v šestnáctkové soustavě.

Procvičení na doma #

Navrhněte program (knihovnu), který bude implementovat základní aritmetické operace (negace,sčítání, odčítání, násobení, dělení, modulo, a základní bitové operace) pro fiktivní typ uint256_t a int256_t

Program pro zkoumání paměti v C #

Přebráno z tohoto zdroje.

#include <stdio.h>

/*
 * Wrapper pro funkci print_mem. Zjisti adresu predavaneho datoveho typu
 * a jeho velikost, kterou je potreba zkoumat.
 */
#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()
{
    unsigned int unsig = 5;
    int sig = -5;

    printf("value = %d\n", unsig);
    PRINT_MEM(unsig);

    printf("\nvalue = %d\n", sig);
    PRINT_MEM(sig);

    return 0;
}