Dane wpisywane z klawiatury w terminalu widnieją jako znaki
i tak są na wstępie traktowane bo nigdy nie wiadomo co będzie wpisane. Może to być cyfra, liczba, znak interpunkcyjny. Oczywiście to wszystko przechowywane jest w postaci binarnej w komputerze i interpretację dokonuje się na podstawie tabeli ASCII.
Gdy użytkownik wpisze 0x2a
- to w buforze znajdzie się np. taka sekwencja {'0', 'x', '2', 'a', '\0'}. To samo z 42
- może widnieć jako {'4', '2', '\0'}. Obie te sekwencje reprezentują tą samą liczbę czyli 42, ale równie dobrze może reprezentować imię jakiegoś bota. Potrzebujesz funkcji np. scanf
, która przetworzy ją na wewnętrzną postać binarną, którą np. będzie można bezpośrednio dodawać używając sprzętowego sumatora, ale to ty decydujesz o sposobie interpretacji danych wejściowych z terminala.
Jeżeli dasz scanf("%d", &i)
to wiadomo, że oczekujesz inta i scanf
nie przyjmie napisu 0x2a
, musisz podać scanf("%x", &i)
informując go tym samym, że oczekujesz postać hexadecymalną/szestnastkową, którą możesz ale nie musisz poprzedzać "0x", więc podane "10" to nie będzie dziesięć dziesiętnie tylko szesnaście. Kompilator jest trochę inteligentniejszy i może przyjąć na klatę różne formy zapisu tej samej liczby:
Kopiuj
int a = 42;
int b = 0x2a;
int c = 052;
int d = 0b101010;
printf("%d %d %d %d\n", a, b, c, d);
rozróżnia je po prefixie. Jakbyś chciał podobne zachowanie to od tego jest strtol
, której podaje się bazę liczby. Jak jest ustawiona na zero to prefiksy określają jaką bazę ma wprowadzana liczba.