Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Reprezentare internă
Operatori pe biți
Preprocesorul C
Recapitulare
Bibliografie selectivă
Reprezentare internă
Să ne amintim:
În matematică:
numerele întregi și reale au domeniu infinit de valori
numerele reale au precizie infinită (oricâte cifre zecimale)
În C:
numerele ocupă un loc finit în memorie
⇒ au domeniu de valori finit și precizie finită (numere reale)
Pentru a lucra corect cu numere, trebuie să înțelegem:
cât loc ocupă și cum se reprezintă în memorie
care sunt limitările de mărime și precizie
ce erori de depășire și rotunjire pot apărea
Reprezentare internă
Orice valoare (parametru, variabilă) ocupă loc în memorie.
◦ bit = cea mai mică unitate de memorare, are două valori posibile: 0 sau 1
◦ octet (byte) = grup de 8 biți, cea mai mică unitate care se poate scrie/citi în/din memorie
Operatorul sizeof ne dă dimensiunea în octeți (bytes) a unui tip sau a unei valori.
Exemplu: sizeof(’A’)==sizeof(char)==1 (un caracter se reprezintă pe 1 octet)
Dimensiunea tipurilor depinde de sistem (procesor, compilator):
ex. sizeof(int) poate fi 2, 4, 8, ...
int main() {
char mybyte=7,i=2;
if (is_set(mybyte, i)) {
printf("bitul %d din octetul %d este setat!\n", i, mybyte);
} else {
printf("bitul %d din octetul %d NU este setat!\n", i, mybyte);
}
return 0;
}
Operatori pe biți #include <stdio.h>
Exemplu de setare a unui bit char set(char byte, int i) {
int mask = (1 << i);
return (byte | mask);
}
int main() {
char mybyte=4,i=3;
printf("Numarul este:%d\n",mybyte);
mybyte=set(mybyte,i);
printf("Numarul nou este:%d\n",mybyte);
return 0;
}
Operatori pe biți #include <stdio.h>
Exemplu de resetare a unui char reset(char byte, int i) {
bit int mask = (1 << i);
mask=~mask;
return (byte & mask);
}
int main() {
char mybyte=4,i=2;
printf("Numarul este:%d\n",mybyte);
mybyte=reset(mybyte,i);
printf("Numarul nou este:%d\n",mybyte);
return 0;
}
Preprocesorul C
Preprocesorul:
◦ este o componentă din cadrul compilatorului C
◦ realizează preprocesarea fișierelor sursă
Dacă se simbolul CHANGE este definit // Verific daca este definit simbolul CHANGE
se va afișa 0, altfel se va afisa 1 #ifdef CHANGE
#undef VALOARE // sterg VALOARE
#define VALOARE 0 // redefinesc simbolul cu alta valoare
#endif
int main() {
printf("VALOARE = %d\n", VALOARE);
return 0;
}
Preprocesorul C
Definirea de macro-uri
Instrucţiunile de preprocesare mai pot fi folosite #define NMAX 100
şi pentru definirea de constante simbolice şi #define MMAX 10
macroinstrucţiuni. De exemplu #define LMAX 10000
#define IDENTIFICATOR valoare ...
int a[NMAX][MMAX];
va duce la înlocuirea peste tot în cadrul codului
sursă a şirului IDENTIFICATOR cu şirul valoare. ...
Înlocuirea nu se face totuşi în interiorul şirurilor int v[LMAX];
de caractere. ...
Un exemplu foarte bun este definirea unor
macro-uri pentru dimensiunile tablourilor alocate
static.
Preprocesorul C
Definirea de macro-uri
O macroinstrucţiune:
◦ este similară unei constante simbolice, ca definire, dar acceptă parametrii.
◦ este folosită în program în mod asemănător unei funcţii
◦ la compilare, ea este înlocuită în mod textual cu corpul ei.
În plus, nu se face nici un fel de verificare a tipurilor. Spre exemplu:
#define MAX(a, b) a > b ? a : b
va returna maximul dintre a şi b, iar
#define DUBLU(a) 2*a
va returna dublul lui a.
Preprocesorul C
Definirea de macro-uri
Deoarece preprocesarea este o prelucrare textuală a codului sursă, în cazul exemplului anterior,
macroinstrucţiunea în forma prezentată nu va calcula întotdeauna dublul unui număr.
Astfel, la o folosire de forma:
DUBLU(a + 3)
în pasul de preprocesare se va genera expresia
2*a+3
care bineînţeles că nu realizează funcţia dorită.
Pentru a evita astfel de probleme, este bine ca întotdeauna în corpul unui macro, numele
„parametrilor” să fie închise între paranteze:
#define SQUARE(a) (a)*(a)
Preprocesorul C
Instrucțiuni de compilare condiționată
Instrucţiunile de compilare condiţionată sunt folosite pentru a „ascunde” fragmente de cod
în funcţie de anumite condiţii. Formatul este următorul:
#if conditie
....
#else
....
#endif
unde conditie este este o expresie constantă întreagă.
#if conditie
...