KWALIFIKACJA INF2 + INF3 - CZERWIEC 2015

PYTANIE NR 9.
Deklaracja zmiennej liczbowej poprzedzona słowem kluczowym unsigned w poniższej postaci sprawi, że w języku C
Ilustracja przedstawia fragment kodu w języku C, który jest częścią pytania egzaminacyjnego dotyczącego deklaracji zmiennej
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Modyfikator unsigned w C oznacza typ całkowity bez znaku, czyli taki, który nie reprezentuje wartości ujemnych. Zmienna zadeklarowana jako unsigned int może więc przyjmować wyłącznie wartości nieujemne (w tym 0). Zakres liczbowy zależy od liczby bitów typu na danej platformie.

Pełne wyjaśnienie:

W języku C słowo kluczowe unsigned modyfikuje typ całkowity tak, aby był to typ bez znaku. Oznacza to, że zmienna nie ma bitu znaku i nie reprezentuje liczb ujemnych. W konsekwencji zmienna zadeklarowana jako unsigned int może przechowywać wyłącznie wartości nieujemne, czyli należące do zbioru {0, 1, 2, 3, …}.

W praktyce często podaje się też zakres jako "od 0 do maksymalnej wartości danego typu". Taki opis jest zgodny z ideą typu bez znaku, ale warto pamiętać o dwóch rzeczach:

  • Zakres zależy od implementacji (liczby bitów przypisanej do unsigned int), więc bez wskazania platformy nie podaje się jednej liczby granicznej.
  • Kluczowa jest semantyka: "bez znaku" = "brak wartości ujemnych", czyli właśnie "wartości nieujemne".

Odpowiedź "zmienna x będzie przyjmowała tylko wartości dodatnie, ale nie ujemne" jest błędna, ponieważ wyklucza zero, a typ bez znaku jak najbardziej może przechowywać 0. Odpowiedź o tym, że "deklaracja nie tworzy stałej" jest zbyt ogólna i nie dotyczy skutku użycia unsigned (to cecha samej deklaracji zmiennej, a nie modyfikatora znaku).

Warto też kojarzyć zachowanie przepełnienia: dla typów bez znaku typowe jest działanie modulo (tzw. wraparound), czyli po przekroczeniu wartości maksymalnej wynik "zawija się" do początku zakresu. To bywa użyteczne w operacjach bitowych, ale może też ukrywać błędy, jeśli ktoś spodziewa się wartości ujemnych jako sygnału błędu.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Unsigned oznacza, że typ całkowity jest bez znaku, czyli nie potrafi reprezentować liczb ujemnych. Wszystkie bity są użyte do kodowania wartości nieujemnych, dlatego minimalną wartością jest 0, a maksymalna zależy od liczby bitów danego typu na platformie.
Tak. 0 jest wartością nieujemną i należy do zakresu typu unsigned int. To częsty błąd: mylenie "nieujemny" z "dodatni". "Dodatni" oznacza > 0, a "nieujemny" oznacza ≥ 0.
W standardzie C nie ma stałej, jednej szerokości dla unsigned int. Implementacja (platforma, kompilator) decyduje, ile bitów ma ten typ, by spełnić minimalne wymagania. Dlatego maksymalna wartość może być różna, choć zawsze jest to zakres od 0 do pewnego maksimum.
Typów bez znaku używa się m.in. do liczników, indeksów tablic, rozmiarów buforów i operacji bitowych (maski, flagi). Dobrze pasują tam, gdzie wartości nie mogą być ujemne. Trzeba jednak uważać, gdy ujemne wartości miałyby sygnalizować błąd.
W praktyce arytmetyka dla typów bez znaku działa jak modulo: po przekroczeniu maksimum następuje tzw. wraparound, czyli "zawinięcie" do początku zakresu (zwykle do 0). To zachowanie bywa użyteczne w niskopoziomowych obliczeniach, ale może też maskować błędy logiczne.
Bo "tylko dodatnie" wyklucza zero, a unsigned dopuszcza 0. Poprawne sformułowanie to "wartości nieujemne". Na egzaminach często sprawdza się właśnie tę różnicę pojęciową, bo wpływa ona na warunki w kodzie i poprawność algorytmów.
Dla tej samej liczby bitów typ bez znaku ma zwykle większy zakres po stronie dodatniej, bo nie traci jednego bitu na znak. Jednak nie porównuje się tego "w próżni": standard C nie gwarantuje identycznej szerokości wszystkich typów. Zależy to od implementacji i doboru typu.
W porównaniach i działaniach mieszanych może dojść do nieoczekiwanych konwersji, przez które liczby ujemne typu ze znakiem stają się dużymi wartościami bez znaku. Mechanizm ten prowadzi do "zaskakujących" wyników warunków i pętli. Dlatego kompilatory często ostrzegają o mieszaniu signed/unsigned.
Można użyć stałej UINT_MAX z nagłówka limits.h. To bezpieczniejsze niż zgadywanie, czy typ ma 16, 32 czy 64 bity. Na egzaminie zwykle wystarczy wiedzieć, że zakres to 0 do maksymalnej wartości zależnej od implementacji, bez podawania konkretnej liczby.
Zwykle nie. Jeśli logika programu przewiduje wartości ujemne jako kod błędu (np. -1), użycie typu bez znaku utrudnia takie sygnalizowanie i może tworzyć trudne do wykrycia błędy (np. -1 po konwersji staje się dużą liczbą). Lepszy jest typ ze znakiem albo osobny mechanizm błędów.
info

Około 69% zdających odpowiada poprawnie na to pytanie. średnie

Według specjalistów z branży: "Modyfikator unsigned w C oznacza typ całkowity bez znaku, czyli taki, który nie reprezentuje wartości ujemnych."

Źródła:

  • ISO/IEC 9899:2018 (C18), sekcje dot. typów całkowitych i zakresów typów unsigned (m.in. 6.2.5 oraz 6.2.6.2) – norma języka C
  • cppreference.com: "C integer types" (opis signed/unsigned i zakresów) https://en.cppreference.com/w/c/language/arithmetic_types - accessed 2026-02-27
  • cppreference.com: "Limits of integer types" (zależność zakresu od implementacji, INT_MAX/UINT_MAX) https://en.cppreference.com/w/c/types/limits - accessed 2026-02-27

Materiały:

  • Dokumentacja standardu języka C (sekcje o typach całkowitych i unsigned)
  • cppreference: opisy typów całkowitych i konwersji arytmetycznych
  • Podręcznik do C omawiający reprezentację liczb i przepełnienia

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego