KWALIFIKACJA INF3 - STYCZEŃ 2024 (test 2)

PYTANIE NR 5.
Który typ danych w języku C++ ma największy zakres wartości?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
"long long" jest w C++ typem całkowitym, który ma co najmniej tak duży zakres jak "long", "int" i "short", ponieważ standard wymusza relację rozmiarów: short ≤ int ≤ long ≤ long long. Konkretne wartości minimalne i maksymalne mogą się różnić między platformami, ale ta relacja pozostaje zachowana.

Pełne wyjaśnienie:

Pytanie dotyczy porównania zakresu wartości podstawowych typów całkowitych w C++. Zakres rozumiemy jako minimalną i maksymalną liczbę, jaką da się zapisać w danym typie (dla typów ze znakiem: od wartości ujemnych do dodatnich).

W standardzie C++ rozmiary (a więc i zakresy) typów w stylu short, int, long, long long nie są opisane jedną, stałą liczbą bitów dla wszystkich komputerów. Zależą od implementacji (platformy, ABI, kompilatora). Standard narzuca jednak kluczową relację porządkującą te typy: short ≤ int ≤ long ≤ long long (w sensie możliwości reprezentacji / nie mniejszego zakresu).

Dlatego odpowiedź "long long" jest poprawna wśród podanych opcji: ma gwarantowanie nie mniejszy zakres niż "long int", "int" i "short".

  • Odpowiedź "short" jest błędna, bo to typ o najmniejszym (lub jednym z najmniejszych) gwarantowanych zakresów w tej grupie.
  • Odpowiedź "int" jest błędna, bo standard dopuszcza, aby "int" był mniejszy od "long" i "long long" (a typowo tak jest).
  • Odpowiedź "long int" jest błędna, bo "long long" ma co najmniej tak duży zakres jak "long", więc "long" nie może wyprzedzać "long long".

W praktyce, jeśli w zadaniu lub projekcie wymagany jest konkretny minimalny zakres (np. "dokładnie 64 bity"), lepiej sięgać po typy o stałej szerokości z <cstdint> (np. int64_t) oraz sprawdzać zakresy przez std::numeric_limits. To pomaga unikać błędów przenośności i przepełnień.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Zakres wartości to przedział liczb, które można zapisać w danym typie, czyli minimalna i maksymalna wartość. Dla typów ze znakiem obejmuje liczby ujemne i dodatnie, a dla bez znaku tylko nieujemne. Zakres zależy od liczby bitów przeznaczonych na zapis.
W C++ standard narzuca relację rozmiarów: short ≤ int ≤ long ≤ long long. To oznacza, że long long ma co najmniej taką pojemność jak int, więc może reprezentować nie mniejszy zakres liczb. Konkretne rozmiary (np. 32/64 bity) zależą jednak od platformy.
Nie. Standard C++ nie gwarantuje jednej stałej liczby bitów dla tych typów na wszystkich platformach. Gwarantuje natomiast ich uporządkowanie (short nie większy niż int itd.). Dlatego kod przenośny nie powinien zakładać, że np. int ma zawsze 32 bity.
Najprościej użyć std::numeric_limits z nagłówka <limits>, np. std::numeric_limits<long long>::min() i ::max(). To zwraca rzeczywiste granice dla użytego kompilatora i platformy, bez zgadywania liczby bitów.
Częste błędy to: zakładanie stałych rozmiarów typów (np. że long zawsze ma 64 bity), nieuwzględnianie przepełnienia, mieszanie typów ze znakiem i bez znaku oraz rzutowania ukrywające błąd. W zadaniach egzaminacyjnych warto pamiętać o relacji short–int–long–long long.
Gdy wymagany jest gwarantowany minimalny zakres, np. dokładnie 64 bity do zapisu identyfikatorów lub liczników. Typy z <cstdint> (np. int64_t) są projektowane do przenośnego kodu, w którym nie chcesz polegać na implementacyjnych rozmiarach typów podstawowych.
Przepełnienie występuje, gdy wynik obliczenia wykracza poza maksymalny (lub minimalny) zakres typu. Dla typów bez znaku zwykle następuje "zawijanie" modulo, a dla typów ze znakiem konsekwencje mogą być problematyczne. Dlatego dobór typu o odpowiednim zakresie jest kluczowy.
Tak, zapis long jest skrótem od long int w deklaracjach. W kontekście pytania odpowiedź "long int" oznacza ten sam typ, co "long". Nie zmienia to faktu, że "long long" ma co najmniej tak duży zakres jak "long".
Najczęściej myli się "long" z "long long" (bo nazwy są podobne) albo wybiera się "int" z przyzwyczajenia. Inny błąd to opieranie się na jednej platformie: np. skoro gdzieś "long" ma 64 bity, to uznaje się, że zawsze będzie największy. W standardzie liczy się relacja typów.
Utrwal: (1) grupy typów (całkowite, zmiennoprzecinkowe, znakowe), (2) relacje rozmiarów short–int–long–long long, (3) typy stałej szerokości z <cstdint>, (4) użycie std::numeric_limits. Rozwiązuj krótkie zadania z przepełnień i konwersji typów.
info

To pytanie poprawnie rozwiązuje 53% zdających egzamin. trudne

Według specjalistów z branży: ""long long" jest w C++ typem całkowitym, który ma co najmniej tak duży zakres jak "long", "int" i "short", ponieważ standard wymusza relację rozmiarów: short ≤ int ≤ long ≤ long long."

Źródła:

  • cppreference.com: "Fundamental types" (C++) – https://en.cppreference.com/w/cpp/language/types (dostęp: 2026-03-02)
  • cppreference.com: "long long (integer type)" – https://en.cppreference.com/w/cpp/language/types#Properties (dostęp: 2026-03-02)
  • cppreference.com: "std::numeric_limits" – https://en.cppreference.com/w/cpp/types/numeric_limits (dostęp: 2026-03-02)

Materiały:

  • Dokumentacja cppreference o typach całkowitych w C++
  • Materiały kursowe C++ dotyczące typów danych i przepełnień
  • Ćwiczenia z użyciem std::numeric_limits do sprawdzania zakresów

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego