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.