czwartek, 26 kwietnia 2018

Język C - Pola bitowe


C - Pola bitowe

Załóżmy, że Twój program C zawiera kilka zmiennych TRUE/FALSE zgrupowanych w strukturze o nazwie status, w następujący sposób:
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status;
Ta struktura wymaga 8 bajtów pamięci, ale w rzeczywistości będziemy przechowywać 0 lub 1 w każdej ze zmiennych. Język programowania C oferuje lepszy sposób wykorzystania przestrzeni pamięci w takich sytuacjach.
Jeśli używasz takich zmiennych wewnątrz struktury, możesz zdefiniować szerokość zmiennej, która mówi kompilatorowi C, że użyjesz tylko tej liczby bajtów. Na przykład powyższą strukturę można ponownie napisać w następujący sposób:
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status;
Powyższa struktura wymaga 4 bajtów pamięci dla zmiennej status, ale tylko 2 bity będą używane do przechowywania wartości.
Jeśli użyjesz do 32 zmiennych, każda o szerokości 1-bitowej, to także struktura statusu użyje 4 bajty. Jednak, gdy tylko masz 33 zmienne, przydzieli on następną szczelinę pamięci i zacznie używać 8 bajtów. Pozwól nam sprawdzić poniższy przykład, aby zrozumieć koncepcję -
#include <stdio.h>
#include <string.h>

/* definicja prostej struktury */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;

/* zdefiniuj strukturę z polami bitowymi */
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status2;

int main( ) {

   printf( " Rozmiar pamięci zajmowany przez status1 : %d\n", sizeof(status1));
   printf( " Rozmiar pamięci zajmowany przez status2 : %d\n", sizeof(status2));

   return 0;
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik:
Rozmiar pamięci zajmowany przez status1 : 8
Rozmiar pamięci zajmowany przez status2 : 4

Deklaracja pola bitowego

Deklaracja pola bitowego ma następującą postać wewnątrz struktury:
struct {
   typ [nazwa elementu] : szerokość ;
};
Poniższa tabela opisuje zmienne elementy pola bitowego -
L.p.
Element i opis
1
typ
Typ integer, który określa sposób interpretacji wartości pola bitowego. Typ może być int, signed int lub unsigned int.
2
Nazwa elementu
Nazwa pola bitowego.
3
szerokość
Liczba bitów w polu bitowym. Szerokość musi być mniejsza lub równa szerokości bitów określonego typu.
Zmienne zdefiniowane za pomocą predefiniowanej szerokości są nazywane polami bitowymi. Pole bitowe może pomieścić więcej niż jeden bit na przykład, jeśli potrzebujesz zmiennej do zapisania wartości od 0 do 7, możesz zdefiniować pole bitowe o szerokości 3 bitów w następujący sposób:
struct {
   unsigned int wiek : 3;
} Wiek;
Powyższa definicja struktury instruuje kompilator C, że zmienna wiek będzie używać tylko 3 bitów do przechowywania wartości. Jeśli spróbujesz użyć więcej niż 3 bitów, nie pozwoli ci tego zrobić. Wykonajmy przykład:
#include <stdio.h>
#include <string.h>

struct {
   unsigned int wiek : 3;
} Wiek;

int main( ) {

   Wiek.wiek = 4;
   printf( "Sizeof( Wiek ) : %d\n", sizeof(Wiek) );
   printf( "Wiek.wiek : %d\n", Wiek.wiek );

   Wiek.wiek = 7;
   printf( "Wiek.wiek : %d\n", Wiek.wiek );

   Wiek.wiek = 8;
   printf( "Wiek.wiek : %d\n", Wiek.wiek );

   return 0;
}
Gdy powyższy kod zostanie skompilowany, skompiluje się z ostrzeżeniem, a po uruchomieniu wygeneruje się następujący wynik:
Sizeof( Wiek ) : 4
Wiek.wiek : 4
Wiek.wiek : 7
Wiek.wiek : 0


Poprzednia strona                                                          Następna strona



Brak komentarzy:

Prześlij komentarz