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 #
-
Převeďte čísla 42 a -57
- do dvojkové soustavy jako typ
uint8_taint8_t - do šestnáctkové soustavy jako typ
uint32_taint32_t.
- do dvojkové soustavy jako typ
-
Převeďte číslo
0b10101010- do desítkové soustavy jako typ
uint16_taint16_t. - do šestnáctkové soustavy jako typ
uint8_taint8_t.
- do desítkové soustavy jako typ
-
Převeďte číslo
0xAFdo binární soustavy jako typuint8_taint8_t. -
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?
-
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?
- jak získáte zbytek po dělení?
- Dokážete v některých případech provést dělení rychleji?
-
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;
}