Strona główna » C++ » Kurs » Typy Zmiennych
 

Typy Zmiennych

Wstęp

Wszystkie dane, które chcemy przechować w trakcie wykonywania programu trafiają do pamięci. Są tam przechowywane w zmiennych. Każda zmienna może reprezentować inny typ danych. Ma to istotny wpływ kiedy chcemy przechować liczbę całkowitą, rzeczywistą czy znak, albo wartość logiczną. W dzisiejszej lekcji przedstawię argumenty dla których warto wiedzieć kilka informacji o każdym typie.

Zmienne

W poprzednich lekcjach poznaliśmy już co jest zmienna i jak się przypisuje dane. Ustaliliśmy również, że każda deklaracja zmiennej alokuje odpowiednio dużo pamięci. Ma to związek z pojemnością zmiennych. Przykładowo zmienna int zajmuje 4 bajty, czyli 32 bity. Oznacza to, że liczby, które tam możemy przechować mieszczą się w zakresie [-2 147 483 648, 2 147 483 647]. To bardzo dużo i wystarczająco dla większości projektów. Jednak istnieje wiele innych typów, których możemy użyć jeśli potrzebujemy zapisać większą lub mniejszą liczbę. Przedstawia to poniższa tabelka:

TypBajtówZakres
short2[-32 768, 32 767]
int4[-2 147 483 648, 2 147 483 647]
int4[-2 147 483 648, 2 147 483 647]
long long8[-9 223 372 036 854 775 808, 9 223 372 036 854 775 807]

Jak widać zakres różnych typów znacząco się różni. Użycie prawidłowego typu danych pozwala na optymalne rozwiązanie - wykonujemy to samo zadania używając jak najmniej pamięci.

Bez znaku

Warto zwrócić uwagę, że każdy typ pozwala na przechowywanie dodatnich i ujemnych wartości. Jednak przy tworzeniu liczników ujemne wartości pozostają niewykorzystane. Możemy je "usunąć" i przy okazji przesunąć zakres przechowywanych wartości. Służy do tego modyfikator unsigned, którego używamy do usunięcia znaku zmiennej wybranego typu. Modyfikator stawiamy przed typem zmiennej. Informujemy tym samym kompilatorem jakie są nasze założenia. Przykładowo chcąc ujemny zakres z typu int deklarujemy zmienną następująco:

  1. unsigned int liczba;

Wtedy zakres typów przechowujących liczby wygląda następująco:

TypBajtówZakres
unsigned short2[0, 65 535]
unsigned int4[0, 4 294 967 295]
unsigned int4[0, 4 294 967 295]
unsigned long long8[0, 18 446 744 073 709 551 615]

Inne typy

Do przechowywania liczb rzeczywistych służy kilka typów:

TypBajtówZakres
float4pojedyncza precyzja, dokładność 6-7 cyfr po przecinku
double8podwójna precyzja, dokładność 15-16 cyfr po przecinku
long double12liczby niemal rzeczywiste, 19-20 cyfr po przecinku

Jak widać każdy z nich różni się precyzją. Jeśli chcemy przechowywać średnie to wystarczający będzie typ float. W przypadku pomiarów, lub liczenia wyrażenia ułamkowego bardziej dokładne okażą się double i long double.

Znaki będziemy przechowywać w zmiennej char (z lub bez modyfikatora unsigned):

TypBajtówZakres
char1[-128, 127]
unsigned char1[0, 255]

Dla wartości logicznej istnieje tylko jeden typ zmiennych bool:

TypBajtówWartości
bool1true, false

Warto zauważyć, że zmienna typu bool zajmuje 1 bajt. Prawidłowo jeśli mamy tylko dwie wartości to możemy je zapisać na jednym bicie zamiast używać ośmiu. Jednak bajt został za przyjętą za najmniejszą jednostkę wskazywaną przez adres. Innymi słowy używając typu bool zapiszemy tylko true lub false, ale istnieją metody, które pozwalają na zapisanie 8 wartości logicznych na jednym bajcie. Jednak wymaga to nieco większej wiedzy programistycznej. Takie rozwiązanie trzeba dostosowywać do każdego projektu.

Rozmiar typu

W zależności od kompilatora ilość zajmowanych bajtów przez wybrany typ może się różnić. Jeśli chcemy sprawdzić jak wybrany typ rozpoznaje nasz kompilator to możemy użyć funkcji sizeof. Funkcja zwróci nam ile bajtów zajmuje wybrany typ danych. Przykładowo sprawdźmy rozmiar zmiennej typu long long:

  1. cout << sizeof(long long);

Po skompilowaniu kodu otrzymamy liczbę:

  1. 8

Jeśli chcesz zobaczyć ile zajmuje bajtów każdy typ. Możesz pobrać poniżej zamieszczony kod źródłowy. Pobrany kod skompiluj i uruchom. Na konsoli zostanie wypisane jaki rozmiar mają poszczególne typy.

Przepełnienie

Załóżmy, że mamy zmienna typu char o wartości 127. Oznacza to, że osiągnęła ona maksimum wartości dla swojego typu. Jednak kiedy dodamy jeden dochodzi do przepełnienia. Liczba jest resetowana i wracamy do wartości -128. Tak samo się dzieje dla każdego typu danych. Zjawisko to jest wytłumaczalne sposobem zapisu danych. Najlepiej jednak zapamiętać, że po ostatniej liczbie z zakresu jest dolna granica zakresu wartości.

Podsumowanie

Lekcja 5 dobiegła końca. Zajrzyj do kodu źródłowego, aby przeanalizować wypisywanie danych jeszcze raz. Następnie spróbuj wykonać zadania, aby utrwalić materiał.

Zadania

Zadanie 1

Pobierz kod źródłowy do ćwiczeń zamieszczony poniżej. Postaraj się zoptymalizować wykorzystanie pamięci odpowiednio dostosowując typy zmiennych lub ich wartości. Efekt końcowy powinien być taki jak poniższy wygląd konsoli:

  1. 3000 40000 10000000000 , 0