PC Laborator 4
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).
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 |
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ă
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>
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++ / ++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 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
#include <stdio.h>
int main(){
int a = 2, b = 6, c = 0, result;
result = !(a < c) && (a < b) || (b <=c);
printf("result is %d\n", result);
return 0;
}
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 |
|
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 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.
#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*/
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
- Scrieți un program care să citească un număr în virgulă mobilă de la tastatură și să se afișeze, pe linii diferite, în hexazecimal, semnul, mantisa și exponentul. Notă: pentru a putea efectua operații pe biți, operanzii trebuie să fie de tip întreg. Astfel, pentru a interpreta un număr în virgulă mobilă ca secvență de biți, variabila trebuie sa fie de tip int, iar citirea să se facă cu template-ul "%f".
- Scrieți un program care să citească de la tastatură un număr întreg fără semn pe 8biți (în bază 10) și să-l afișeze pe ecran în baza doi, folosind operatori de shiftare și mascare.
- Citiți de la tastatură un număr întreg cu semn, pe 32 de biți, apoi negați-l aritmetic și afișați valoarea, fără să folosiți operatorului unar "-" (folosind regulile convenției complement față de 2).
- Scrieți un program care să citească un număr întreg pe 8 biți de la tastatură, să numere și să afișeze câți biți de 1 și câți biți 0 are reprezentarea lui binară.
- Citiți de la tastatură un număr întreg n, calculați și afișați suma numerelor de la 0 la n.
- Citiți o valoare de temperatură în grade Celisus, și afișați pe ecran valoarea acelei temperaturi în Kelvin și grade Fahrenheit.
- Fie o matrice de 8 linii și 10 coloane, cu elementele numerotate de la 0 (elementul din stânga sus) la 79 (elementul din dreapta jos):
Dându-se de la tastatură un index n între 0 si 79, să se afișeze pe ce linie și pe ce coloană este indexul respectiv.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 70 71 72 73 74 75 76 77 78 79
- Dându-se un număr întreg de la tastatură, să se afișeze 0 dacă numărul este impar și 1 dacă este par.
- (dificil) Folosind doar operații pe biți (fără construcții condiționale), să se calculeze modulul unui număr întreg pe 32 de biți, introdus de la tastatură.