PC Laborator 4
Obiective
Familiarizarea cu noțiunile de bază ale limbajului C: tipuri de date numerice, operatori aritmetici, operatori pe biți dar și folosirea corectă a acestora.
Tipuri de date
Tipuri de date întregi
Tipurile de date întregi fundamentale ale limbajului C sunt char
și int
.
Tipuri fundamentale | ||
---|---|---|
Tip | Număr de biți | Domeniu |
char | 8 | -128 ... +127 |
int | min. 16 | -32,768 ... +32,767 |
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.
Modificatori
- signed (implicit) - tip de dată cu semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [-2n-1:2n-1-1];
- unsigned - tip de dată fără semn, utilizabil excusiv pentru numere întregi, face ca intervalul de definiție să fie între [0:2n-1];
- long - de obicei, dublează domeniul de definiție pentru int; de exemplu un long int va avea 64 de biți în loc de 32;
- short - de obicei, înjumătățește domeniul de definiție pentru int, adică rezultatul este un tip de dată pe 16 biți.
Folosirea modificatorilor | ||
---|---|---|
Tip | Număr de biți | Domeniu |
unsigned char | 8 | 0 ... 255 |
unsigned long int | 64 | 0 .. 18,446,744,073,709,551,615 |
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. Modul de reprezentare a valorilor negative se face folosind convenția complement față de 2.
Tipuri în virgulă mobilă
Tipurile de date în virgulă mobilă ale limbajului C sunt float
, double
și long double
.
Tipuri fundamentale | ||
---|---|---|
Tip | Număr de biți | Domeniu |
float | 32 | Precizie 4 zecimale |
double | 64 | Precizie 8 zecimale |
long double | 80 | Precizie 16 zecimale |
Un număr este reprezentat în virgulă mobilă printr-un cuvant de n biți conținând semn, mantisă și exponent sub următoarea formă:
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>
Tipuri de date de dimensiune fixă în standardul C99
Deoarece există situații când numărul de biți pentru un anumit tip de dată este extrem de important, iar acest număr diferă între procesoare și compilatoare, standardul C99 a introdus următoarele tipuri de date, de dimensiune fixă, care se găsesc în header-ul stdint.h
:
Tipuri de dimensiune fixă | ||
---|---|---|
Tip | Numar de biti | Domeniu |
int8_t | 8 | -128 .. +127 |
uint8_t | 8 | 0 .. 255 |
int16_t | 16 | -32,768 ... +32,767 |
uint16_t | 16 | 0 ... +65,535 |
int32_t | 32 | -2,147,483,648 .. 2,147,483,647 |
uint32_t | 32 | 0 .. 4,294,967,295 |
int64_t | 64 | -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807 |
uint64_t | 64 | 0 .. 18,446,744,073,709,551,615 |
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++ / ++a - incrementare a-- / --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 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
Tabele de adevăr
Operator | Tabel de adevăr | Operator | Tabel de adevăr | Operator | Tabel de adevăr | |||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AND |
|
OR |
|
XOR |
|
Operatorul ȘI pe biți (BWAND)
Dorim să aflăm valoarea bitului de pe poziția 2 a numarului 20.Pentru a afla valorea acestui bit se poate realiza operația AND (&) între numărul dorit și un alt număr binar care are doar pe poziția dorită valoarea 1 (în cazul nostru poziția 2),astfel dacă rezultatul este diferit de 0 atunci inițial am avut bitul 1, respectiv 0 dacă bitul a fost 0.
Operator | Tabel de adevăr | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
AND |
#include <stdio.h>
int main() {
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("Rezultatul este diferit de 0\n");
} else {
printf("Rezultatul are valoarea 0\n");
}
return 0;
}
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*/
Observatie: Deplasarea la stânga (<<) completează la dreapta cu 0, deci biţii din stânga se vor pierde.
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*/
Exerciții
|