10.5. Camp
2019/03/27 in Programare in C
Limbajul C permite definirea si prelucrarea datelor pe biti. Utilizarea lor poate conduce la economisirea de memorie. Intr-adevar, adesea avem nevoie de date care au numai doua valori, zero sau unu. O astfel de data poate fi pastrata pe un singur bit. De aceea, pentru astfel de date, nu se justifica sa alocam un octet sau chiar doi. In general, nu este util ca date de valori mici sa fie pastrate pe octeti sau pe 16 biti, mai ales atunci cand aceste date sunt in numar mare. In acest scop, limbajul C ofera posibilitatea de a declara date care sa se aloce pe biti.
Un sir de biti adiacenti formeaza un camp. Un camp trebuie sa se poata pastra intr-un cuvant calculator.
Mai multe campuri pot fi pastrate intr-un acelasi cuvant calculator.
Campurile se grupeaza formand o structura. O astfel de structura se declara ca o structura obisnuita care are ca si componente campuri:
struct nume {
camp_1;
camp_2;
...
camp_n;
} nume1, nume2, ..., numem;
Un camp se declara astfel:
tip nume_camp:lungime_in_biti
sau:
tip:lungime_in_biti
De obicei, tip est cuvantul cheie unsigned, ceea ce inseamna ca sirul de biti din campul respectiv se interpreteaza ca fiind un intreg fara semn. Alte posibilitati pentru tip sunt:
- int;
- unsigned char;
- char.
Campurile se aloca de la bitii de ordin inferior ai cuvantului spre cei de ordin superior.
Campurile cu semn se utilizeaza pentru a pastra intregi de valori mici prin complement fata de doi. De aceea, in acest caz, bitul cel mai semnificativ al campului este bit semn.
Un camp fara nume nu se poate referi. El defineste o zona neutilizata dintr-un cuvant.
Lungimea in biti poate fi egala cu zero. In acest caz, data urmatoare se aloca cuvantului urmator.
Campurile se pot referi folosind aceleasi conventii ca si in cazul structurilor obisnuite.
Exemplu:
struct {
unsigned a:2;
int b:2;
unsigned :3;
unsigned c:2;
unsigned :0;
int d:5;
unsigned e:5;
} x, y;
Pentru x se aloca doua cuvinte, astfel:
x.a=1 | atribuie campului a al datei x valoarea 1, deci bitul 0 devine 1, iar bitul 1 ia valoarea 0; |
x.b=-1 | atribuie campului b al datei x valoarea -1.
Aceasta inseamna ca ambii biti ai lui b se fac egali cu 1 (11 este reprezentarea lui -1 pe 2 biti prin complement fata de 2). |
Nu se pot defini tablouri de campuri. De asemenea, operatorul adresa (& unar) nu se poate aplica la un camp.
Datele pe biti conduc la programe care, de obicei, nu sunt portabile sau au o portabilitate redusa. De aceea, se recomanda utilizarea lor cu precautie.
De asemenea, datele pe biti necesita instructiuni suplimentare (deplasari, setari si / sau mascari de biti etc.) fata de cazul cand sunt pastrate in mod obisnuit (ca date de tip int sau char). De aceea, utilizarea lor se justifica numai atunci cand alocarea pe biti conduce la o economie substantiala de memorie fata de alocarea pe octeti sau pe cuvinte de 16 biti.
Observatie:
Prelucrarea datelor pe biti se poate realiza si fara a defini campuri de biti, utilizand operatorii logici pe biti. Utilizarea lor poate conduce insa la un efort de programare suplimentar, care poate fi destul de semnificativ. De asemenea, utilizarea operatorilor respectivi poate sa nu fie facuta optim sau sa conduca la folosirea unor expresii eronate.
Aceasta nu inseamna ca trebuie sa renuntam la utilizarea operatorilor logici pe biti. Exista situatii cand utilizarea lor permite scrierea unor programe mai performante decat daca se utilizeaza, in aceleasi scopuri, campuri de biti.