39
zmiennej pierwszy bit z lewej strony (nazywany także bitem najbardziej znaczącym) przechowuje znak liczby. Efektem tego jest spadek "pojemności" zmiennej, czyli zmniejszenie największej wartości, którą możemy przechować w zmiennej.
Signed oznacza liczbę ze znakiem, unsigned — bez znaku (nieujemną). Mogą być zastosowane do typów: char i int i łączom* ze specyfikatorami short i long (gdy ma to sens).
Jeśli przy signed lub unsigned nie napiszemy, o jaki typ nam chodzi, kompilator przyjmie wartość domyślną czyli int.
Przykładowo dla zmiennej char(zajmującej 8 bitów zapisanej w formacie uzupełnień do dwóch) wygląda to tak:
signed char a; /* zmienna a przyjmuje wartości od -128 do 127 */
unsigned char b; /* zmienna b przyjmuje wartości od 0 do 255 */
unsigned short c; unsigned long int d;
Jeżeli nie podamy żadnego ze specyfikatora wtedy liczba jest domyślnie przyjmowana jako signed (nie dotyczy to typu char. dla którego jest to zależne od kompilatora).
signed int i = 0;
// jest równoznaczne z: int i ■ 0;
Liczby łx‘z znaku |>ozwalają nam zapisać większe liczby przy tej samej wielkości zmiennej — sile trzeba uważać, by nie zejść z nimi poniżej zera wtedy "przewijają" się na sam koniec zakresu, co może powodować t rudne do wykrycia błędy w programach.
Short i long są wskazówkami dla kompilatora, by zarezerwował dla danego typu mniej (odpowiednio — więcej) pamięci. Mogą być zastosowane do dwóch typów: int i double (tylko long), mając różne znaczenie.
Jeśli przy słiort lub long nie napiszemy, o jaki typ nam chodzi, kompilator przyjmie wartość domyślną czyli int.
Należy pamiętać, że to jedynie życzenie wobec kompilatora — w wielu kompilatorach typy int i kmg int mają ten sam rozmiar. Standard języka C nakłada jedynie na kompilatory następujące ograniczenia: int nie może być krótszy niż 16 bi
tów; int musi być dłuższy lub równy short a nie może być dłuższy niż long:
short int nie może być krótszy niż 16 bitów; long int nie może być krótszy niż 32 bity:
Zazwyczaj typ int jest typem danych o długości odpowiadającej wielkości rejestrów procesora, czyli na procesorze szesnastobitowym ma 16 bitów, na trzydziesto-dwubitowym 32 itd.1. Z tego powodu, jeśli to tylko możliwe, do reprezentacji liczb całkowitych preferowane jest użycie typu int bez żadnych specyfikatorów rozmiaru.
Wiraże .się to z pewnymi uwarunkowaniami historycznymi. Podręcznik do języka C duetu K&R zakładał, żc typ int miał się odnosić do typowej dla danego procesora długości liczby całkowitej. Natomiast, jeśli procesor mógł olndugiwać typy dłuższe lub krótsze stutownego znaczenia nabierały modyfikatory short i long. Dolirym przykładem może być architektura i386, która umożliwia obliczenia na liczbach 16-bhowyeh. Dlatego toż modyfikator short powoduje skrócenie zmiennej do 16 bitów.