Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C: Typy danych


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)
Pozostałe są tylko ich pochodnymi.

Tabelka 1 - Typy danych ze znakiem.
TypRozmiarZakres
char1 bajt-128 do 127
short2 bajty-32768 do 32767
int2 bajty
lub
4 bajty
-32,768 do 32,767

-2.147.483.648 do 2.147.483.647
long int4 bajty-2.147.483.648 do 2.147.483.647
float4 bajty+/-3.4e1038 to +/-3.4e1038
double8 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.
TypRozmiarZakres
unsigned char1 bajt0 to 255
unsigned short2 bajty0 do 65535
unsigned int2 bajty
lub
4 bajty
0 do 65535
lub
0 do 4.294.967.295
unsigned long int4 bajty0 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)
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
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

4 komentarze:

  1. Co oznacza znak "%u" ?

    OdpowiedzUsuń
  2. 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ń
  3. 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ń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.