Autor: Dondu
Kurs języka C: Spis treści
Każdy program operuje na jakichś danych. Dane te muszą mieć zadeklarowany typ, który określa:
- rozmiar (ilość zajmowanego miejsca w pamięci),
- zakres przechowywanej danej,
- operacje jakie mogą być na niej wykonywane.
C operuje w zasadzie tylko na danych typu:
- char (liczba całkowita)
- int (liczba całkowita)
- float (liczba zmiennoprzecinkowa pojedynczej precyzji)
- double (liczba zmiennoprzecinkowa podwójnej precyzji)
Tabelka 1 - Typy danych ze znakiem.
Typ | Rozmiar | Zakres |
---|---|---|
char | 1 bajt | -128 do 127 |
short | 2 bajty | -32768 do 32767 |
int | 2 bajty lub 4 bajty | -32,768 do 32,767 -2.147.483.648 do 2.147.483.647 |
long int | 4 bajty | -2.147.483.648 do 2.147.483.647 |
float | 4 bajty | +/-3.4e1038 to +/-3.4e1038 |
double | 8 bajtów | +/-1.7E10308 to +/-1.7E10308 |
unsigned (ang. bez znaku)
To przedrostek typu zmieniający zakres zmiennej na przechowywanie wyłącznie liczb dodatnich.
Nie zawsze jest nam potrzebna liczba ze znakiem. Warto wtedy (dla niektórych typów) oszczędzać zasoby pamięci i moc obliczeniową procesora, deklarując zmienne jako zmienne bez znaku. Na przykład gdy potrzebowałeś zmiennej do przechowywania wartości od 0 do 40tys. zamiast int ze znakiem (4 bajty) użyj unsigned short (2 bajty):
Tabelka 2 - Typy danych bez znaku.
Typ | Rozmiar | Zakres |
---|---|---|
unsigned char | 1 bajt | 0 to 255 |
unsigned short | 2 bajty | 0 do 65535 |
unsigned int | 2 bajty lub 4 bajty | 0 do 65535 lub 0 do 4.294.967.295 |
unsigned long int | 4 bajty | 0 do 4.294.967.295 |
Dlaczego int może mieć 2 lub 4 bajty?
Zależy to od systemu dla jakiego podczas kompilacji przygotowywany jest kod wynikowy. Sprawdźmy empirycznie jakie rozmiary danych są w systemie zainstalowanym na serwerze kompilatora CManiak. W tym celu wykorzystamy funkcję sizeof():
Przykład 1 (w kompilatorze)
printf( "char: %d\n", sizeof(char)); printf( "short: %d\n", sizeof(short)); printf( "int: %d\n", sizeof(int)); printf( "float: %d\n", sizeof(float)); printf( "double: %d\n", sizeof(double));
W momencie gdy pisałem ten artykuł zainstalowany był 32-bitowy system UNIX stąd zmienna zadeklarowana jako unsigned int mogła przechowywać wartość do 4.294.967.295 (0x ffff ffff). Sprawdźmy empirycznie jak jest aktualnie:
Przykład 2 (w kompilatorze)
Możesz sprawdzić także pozostałe typy danych.
Kurs języka C: Spis treści
Przykład 2 (w kompilatorze)
unsigned int X, max_X; //deklaracja zmiennych bez znaku X = 1; //nadaj wartość początkową while (X > 0) { //dopóki X się nie przepełni max_X = X; //wykonuj ten kod X++; //zwiększ X o jeden } //gdy nastąpiło przepełnienie X pokaż maksymalną wartość jaką miał X printf ("Maksymalna wartość: %u", max_X);
Możesz sprawdzić także pozostałe typy danych.
Kurs języka C: Spis treści
2
Co oznacza znak "%u" ?
OdpowiedzUsuńTo oznacza formatowanie liczby jako liczby dziesiętnej bez znaku. Więcej na ten temat znajdziesz w opisie funkcji z rodziny printf: Rodzina funkcji printf
OdpowiedzUsuńDługość typu danych int to najszybciej obsługiwany typ na danej platformie, nie krótszy jednak niż 16 bitów. Precyzyjnie _zawsze_ można spodziewać się 16 bitów a czasem można otrzymać więcej :-) Już nie będę zgłaszał uwag co do długości innych typów bo także nieprecyzyjne. Tam są zobowiązania ,,nie krótszy niż" np dla short... Może by to poprawić?
OdpowiedzUsuńSłuszna uwaga.
Usuń