Diferență între revizuiri ale paginii „PC Laborator 3”
Linia 58: | Linia 58: | ||
<math> valoare=(-1)^s*m*(baza)^e </math> | <math> valoare=(-1)^s*m*(baza)^e </math> | ||
− | |||
<div class="regula">'''<font color="red"> Observatie:</font>''' Cea mai utilizată bază este baza 2. Mantisa însă trebuie să îndeplinească condiția: 1 > m >= 1/baza | <div class="regula">'''<font color="red"> Observatie:</font>''' Cea mai utilizată bază este baza 2. Mantisa însă trebuie să îndeplinească condiția: 1 > m >= 1/baza |
Versiunea de la data 24 septembrie 2015 15:23
Obiective
Familiarizarea cu noțiunile de bază ale limbajului C: tipuri de date, operatori, dar și folosirea corectă a acestora.
Tipuri de date
Tipurile de date fundamentale ale limbajului C sunt: caractere (char), întregi (int), numere reale reprezentate în virgulă mobilă cu simplă precizie (float), numere reale reprezentate în virgulă mobilă cu dublă precizie (double) şi fără valoare (void).
Tipuri fundamentale | ||
---|---|---|
Tip | Numar de biti | Domeniu |
char | 8 | -127 ... 128 |
int | 16 | -32,768 ... 32,767 |
float | 32 | Precizie 6 zecimale |
double | 64 | Precizie 10 zecimale |
void | - | Fără valoare |
Exceptând tipul void, tipurile fundamentale pot fi precedate de diferiţi modificatori. Un modificator se utilizează pentru a adapta cât mai convenabil tipul de bază la situație.
Tipuri reale(float,double) și virgulă mobilă
Observatie: Principalul dezavantaj al reprezentării în virgulă fixă este faptul că, dacă un număr nu mai încape în spaţiul de biţi rezervat, se pierd cifrele cele mai semnificative.
Un număr este reprezentat în virgulă mobilă printr-un cuvant de n biți,conținând:
s | e | m |
---|
Unde s este bitul de semn al numarului, cu aceeași convenție ca pentru numere in virgulă fixa(s=0 numar pozitiv si s=1 numar negativ), m este mantisa numarului, reprezentând cifrele semnificative, iar e este exponentul (puterea la care trebuie ridicata o valoare)
Valoarea numarului real reprezentat in virgula mobila este data de expresia:
<math> valoare=(-1)^s*m*(baza)^e </math>
Modificatori
- signed
- unsigned
- long
- short
Folosirea modificatorilor | ||
---|---|---|
Tip | Numar de biti | Domeniu |
unsigned char | 8 | 0 ... 255 |
unsigned long int | 16 | 0 ... 4,294,967,295 |
Diferenţa dintre întregii signed şi unsigned constă în interpretarea diferită a bitului semnificativ (adică cel mai din stânga). Pentru un întreg signed, se va considera bitul semnificativ ca fiind bit de semn. Dacă acest bit este 0 atunci numărul este pozitiv iar dacă este 1 atunci este negativ.
Operatori
Operatorii aritmetici:
- + adunarea
- - scăderea
- * înmulţirea
- / împărţirea (rezultatul împărţirii pentru numere reale, câtul împărţirii pentru numere întregi)
- % modulo (restul împărţirii a două numere întregi)
- ++ incrementarea (mărirea unei valori cu o unitate)
- -- decrementarea (micşorarea unei valori cu o unitate)
Operatorii de incrementare/decrementare sunt folosiţi pentru creșterea/micşorarea unei valori cu o unitate.
a++ - incrementare --a - decrementare
De asemenea se pot folosi instrucțiuni de pre sau post incrementare/decrementare.
POST-incrementare: x = a++;
x = a;
a = a + 1;
PRE-incremenatare: x = ++a;
a = a + 1;
x = a;
Operatori relaţionali şi logici:
- > - mai mare
- >= -mai mare egal
- < -mai mic
- <= -mai mic egal
- = -egal
- != -diferit
- && -si
- || -sau
- ! -negare
Exemplu operatori relaționari și logici
int a=2,b=6,c=0,result;
result=!(a < c) && (a<b) || (b<=c);
printf("%d\n",result);
Operatori la nivel de bit:
Avem şase operatori la nivel de bit,aceștia se aplică tipurilor char,int,long signed/unsigned,iar rezultatul este un întreg. Operatorii la nivel de bit sunt următorii.
- & - AND (şi logic)
- | - OR (sau logic)
- ^ - XOR (sau exclusiv)
- << - deplasare la stânga
- >> - deplasare la dreapta
- ~ - negare la nivel de bit
Exemplu operator AND
Dorim să aflăm valoarea bitului de pe poziția 2 a numarului 20.Pentru a afla valorea acestui bit se poate realizare operația AND (&) între numărul dorit și un alt număr binar care are doar pe poziția dorită (în cazul nostru 2) valoarea 1,astfel dacă rezultatul este diferit de 0 atunci inițial am avut bitul 1, respectiv 0 dacă bitul a fost 0.
int a=20; /* 1 0 1 0 0 */
int b=4; /* 0 0 1 0 0 */
if(a & b) /* 0 0 1 0 0*/
printf("bitul are valoarea 1\n");
else
printf("bitul are valoarea 0\n");
Exemplu operator de deplasare <<
Operatorii de deplasare (<< şi >>) realizează deplasarea biţilor din operandul stâng cu atâtea poziţii câte sunt indicate de operandul drept.
int a= 255; /* 0000 0000 1111 1111*/
a=a<<3; /* 0000 0111 1111 1000*/
Exemplu operator de negare ~
Operatorul de negare realizează complementarea biților,biții de 0 se pun 1,iar biții de 1 se pun 0.
int a= 2200; /* 1000 1001 1000*/
a=~a; /* 0110 0110 0111*/