Skip to content

Latest commit

 

History

History
205 lines (141 loc) · 5.92 KB

File metadata and controls

205 lines (141 loc) · 5.92 KB

Podstawy C++

Typy danych

Coders School

Prosta matematyka

  • 1 bajt == 8 bitów
  • W binarnym totolotku wylosowane liczby mogą mieć 0 lub 1
  • Zatem podczas losowania 8 numerków możemy otrzymać przykładowo: 1 0 1 0 1 0 1 0
  • Takich kombinacji jest dokładnie 256 -> (2^8)
  • Zatem na 1 bajcie (8 bitach) możemy zapisać 256 liczb, np. od 0 do 255
  • Jeżeli w totolotku losujemy 32 numerki, (32/8 = 4) czyli 4 bajty to takich kombinacji jest 2^32 (czyli ponad 4 miliardy)

Typ pusty - void

  • Nie można tworzyć obiektów typu void
  • Służy do zaznaczenia, że funkcja nic nie zwraca
  • Można tworzyć wskaźniki void* (zła praktyka w C++)
  • NIE służy do oznaczania, że funkcja nie przyjmuje argumentów
int fun(void) { /* ... */ }  // bad practice, C style
int fun() { /* ... */ }      // good practice, C++ style

Typ logiczny - bool

  • Rozmiar: co najmniej 1 bajt (zazwyczaj równy właśnie 1)
    • sizeof(bool) >= 1
  • 2 możliwe wartości
    • false
    • true

Typy znakowe

  • Rozmiar: 1 bajt
  • 256 możliwych wartości
  • char -> od -128 do 127
  • unsigned char -> od 0 do 255

Przedrostek unsigned oznacza, że typ jest bez znaku (bez liczb ujemnych), czyli od 0 do jakieś dodatniej wartości.

Rozmiar typów znakowych to zawsze 1 bajt.

Rozmiary dalszych typów zależą od platformy np. 32 bity, 64 bity.


Typy całkowitoliczbowe

  • short (unsigned short) - co najmniej 2 bajty
  • int (unsigned int) - co najmniej 2 bajty
  • long (unsigned long) - co najmniej 4 bajty
  • long long (unsigned long long) - co najmniej 8 bajtów

Typy zmiennoprzecinkowe

  • float - zwykle 4 bajty
  • double - zwykle 8 bajtów
  • long double - zwykle 10 bajtów (rzadko stosowany)
  • Typy zmiennoprzecinkowe zawsze mogą mieć ujemne wartości (nie istnieją wersje unsigned)
  • Posiadają specjalne wartości:
    • 0, -0 (ujemne zero)
    • -Inf, +Inf (Infinity, nieskończoność)
    • NaN (Not a Number)

Uwaga! Porównanie NaN == NaN daje false

Zaawansowana lektura: Standard IEEE754 definiujący typy zmiennoprzecinkowe


Aliasy typów

Istnieją też typy, która są aliasami (inne nazewnictwo w celu lepszego zrozumienia typu).

std::size_t w zależności od kompilatora może być typu (unsigned short, unsigned int, unsigned long, unsigned long long). Przeważnie jest on typu unsigned int. Warto wykorzystywać go, gdy nasza zmienna będzie odnosić się do jakiegoś rozmiaru np. wielkość tablicy.

Własne aliasy typów możemy tworzyć używając typedef lub using

typedef int Number;
Number a = 5;   // int a = 5;

using Fraction = double;
Fraction b = 10.2;  // double b = 10.2;

Typ auto

W pewnych miejscach możemy użyć typu auto. Kompilator sam wydedukuje typ, np. na podstawie przypisanej wartości.

  auto num = 5;         // int
  auto num = 5u;        // unsigned int
  auto num = 5.5;       // double
  auto num = 5.f;       // float
  auto letter = 'a';    // char
  auto num = false;     // bool
  auto sth;             // compilation error, unable to deduce type

Rozmiary typów

Standard C++ definiuje taką zależność pomiędzy rozmiarami typów całkowitoliczbowych

1 == sizeof(char) \
  <= sizeof(short) \
  <= sizeof(int) \
  <= sizeof(long) \
  <= sizeof(long long);

Operacje arytmetyczne

  • Podstawowe: + - * /
  • Modyfikujące zmienną: += -= *= /=
  • Inkrementujące (+1) zmienną: ++
  • Dekrementujące (-1) zmienną: --

Przykłady

int a = 5 + 7; // a = 12
int a = 5;
a += 7; // a = 12
int a = 5;
++a; // a = 6
a--; // a = 5

Pytania

int i = 5;
auto j = i++ - 1;

Ile wynoszą wartości i oraz j?

i = 6

j = 4

Jakiego typu jest j?

int


Mały suchar

Kim jest Hobbit?

Jest to 1/8 Hobbajta :)


Linki dla poszerzenia wiedzy