Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Date

c


Date

Datele cu care opereaza un program C pot face obiectul mai multor tipuri de clasificari:



Date (ca operanzi)

constante   

o       literale ("as is")

o       simbolice("as defined")

variabile

Date (ca mod de reprezentare)

intregi

o       cu semn (reprezentare interna: complement fata de 2)

o       fara semn    (reprezentare interna: baza 2)

reale     (reprezentare interna: virgula mobila) 151j98b

Date (ca mod de interpretare)

numerice

caractere

adrese

Date (sub aspectul multiplicitatii)

scalare

agregate

o       tablouri

o       structuri

o       uniuni

o       bit-fields (campuri de biti)

Tipuri speciale de date

siruri de caractere

enumerari

Diferentierea intre tipurile de date se poate face

in functie de modul de reprezentare (intregi vs. reale, complement fata de doi vs. virgula flotanta)

in functie de interpretare (intregi vs. caractere, intregi vs.enumerari, intregi fara semn vs. pointeri)

Datele intregi sunt reprezentate in complement fata de doi. Din plaja totala de valori reprezentabile pe un numar dat de biti, prima jumatate este rezervata valorilor pozitive iar cealalta jumatate (se recunosc dupa faptul ca bitul cel mai semnificativ este egal cu 1) numerelor negative.

Reprezentare Valoare ca Valoare ca

binara numar fara semn numar cu semn

0000 0 0

0001 1 1

0010 2 2

>= 0 0011 3 3

0100 4 4

0101 5 5

0110 6 6

0111 7 7

8 -8

1001 9 -7

1010 10 -6

1011 11 -5

< 0 1100 12 -4

1101 13 -3

1110 14 -2

1111 15 -1

Modalitatea de reprezentare se numeste in complement fata de 2 pentru ca reprezentarea interna a numerelor negative (pe n biti) se obtine prin scaderea valorii absolute a numarului din 2n. Cu alte cuvinte, reprezentarea unui numar negativ reprezinta "complementul" (valoarea) ce trebuie adaugata valorii absolute pentru a obtine puterea a n-a a lui 2.

De ex., daca n=4, numarul de reprezentat -5, atunci

24

0101 |-5| (adica 5)

------

1011 -5 (in reprezentarea in complement fata de 2)

Datele reale, caracterizate prin aceea ca pe langa o parte intreaga au (pot avea) si o parte fractionara, ridica cateva probleme. Intrucat in gama de probleme de rezolvat prin utilizarea calculatorului pot apare atat numere foarte mari (cu partea intreaga foarte mare) cat si numere foarte mici (cu parte fractionara reclamand multe pozitii pentru a reprezenta cifrele semnificative), pentru a impaca ambele situatii ar fi necesar un spatiu mare (dublu) de memorie pentru reprezentarea numerelor reale cel putin la nivelul numerelor intregi. In aceasta situatie insa operatiile de manipulare (transfer memorie in/din registri) a acestor date ar fi foarte costisitoare ca timp si nici nu s-ar justifica in majoritatea situatiilor. De exemplu, pentru numere cu cateva cifre la partea intreaga si cateva la partea fractionara, nu ar fi necesar sa se risipeasca 64 de biti. Mai mult, in functie de problema concreta, de obicei apar ca operanzi si rezultate numere din aceeasi "categorie": fie numere mari la care partea fractionara lipseste sau este semnificativa doar pe primele pozitii de dupa virgula, fie numere mici, cu multe cifre semnificative la partea fractionara si doar cateva la partea intreaga.

Solutia aleasa pentru reprezentarea numerelor reale presupune "mutarea"virgulei care desparte partea intreaga de cea fractionara in functie de necesitati astfel ca pe un numar dat de pozitii sa se poata reprezenta si cel mai mare numar intreg (fara cifre semnificative la partea fractionara) si cel mai mic numar subunitar ( fara parte intreaga sau cu un numar minim de cifre la partea intreaga).

Aceasta reprezentare se numeste reprezentarea cu virgula mobila sau cu virgula flotanta (floating point). Ideea este relativ simpla: se pastreaza cifrele semnificative ale numarului (toate de la parte intreaga si atatea cate incap de la partea fractionara) si pozitia virgulei.

Cele trei elemente a caror reprezentare e necesara, in cazul datelor reale, sunt

semnul:    1 bit

exponentul    8 - 16 biti

mantisa (normalizata) 23 - 63 biti

S

Exponent

Mantisa(normalizata)

Relatia ("grosso modo") dintre cele trei elemente si numarul N reprezentat este

N= (S) bExpoent * Mantisa

(Detalii la laborator!)

Exista si diferente de interpretare a datelor intregi. De exemplu un numar intreg (mai mic decat 255) poate fi interpretat si ca un caracter care are codul ASCII egal cu valoarea intregului. Invers, orice cod ASCII este un numar intreg!

Problema consta doar in a putea preciza in cursul unui program modul in care se doreste interpretata o data.

Tipuri de date de baza in C

Fiecare mod de reprezentare a datelor, utilizabile in C, care precizeaza

plaja de valori

operatiile permise

se numeste tip de data. Tipurile de baza (sau fundamentale) in C sunt:

pentru date intregi:

char, short, int, long

pentru date reale:

float, double, long double

In esenta, tipul unei date specifica:

Spatiul necesar reprezentarii (1, 2, 4, 8, 10 octeti)

Modul de reprezentare (complement fata de 2 sau virgula mobila)

Modul in care o data se reprezinta/interpreteaza se precizeaza

in cazul constantelor literale prin modul de scriere

iar in cazul variabilelor prin declaratia de tip

Specificarea constantelor

Constantele se pot specifica in doua moduri:

prin valoarea lor (constante literale)

prin definirea unor simboluri carora li se asociaza valoarea constantei (constante simbolice)

Definirea constantelor simbolice face uz tot de constante literale pentru a asocia o valoare simbolului ce se defineste.

Specificarea constantelor intregi

In mod implicit constantele intregi se reprezinta ca date de tipul int. In cazul in care valoarea constantei este in afara plajei de valori pentru acest tip, se va utiliza tipul long

Exemple:

-32768, -1, 0, 1 1000, 5000, 32767 constante intregi reprezentate ca int

-32769, 32768, 100000 constante intregi reprezentate ca long

Fortarea reprezentarii ca long, chiar daca valoarea sa n-ar justifica-o, se poate face prin utilizarea sufixului L

Exemple:

-1L, 0L, 1L

Fortarea reprezentarii unei constante pozitive ca un intreg fara semn se face prin utilizarea sufixului U

Exemple:

1U, 32768U, 65535U constante intregi reprezentate ca unsigned int

1UL, 50000UL 65536U constante intregi reprezentate ca unsigned long

Constantele intregi pot fi specificate si in baza de numeratie 8, respectiv 16 prin utilizarea prefixelor 0 respectiv 0x sau 0X.

Exemple:

01, 010, 01777 constante octale

0x1, 0XA5, 0XFF, 0xFFFF constante hexazecimale

Specificarea constantelor flotante

In mod implicit, constantele reale se reprezintaca date de tipul double. Semnul distinctiv fata de specificarea constantelor intregi il reprezinta utilizarea punctului zecimal.

Exemple:

-100., -1.5, .5, 0.75, 1.57 constante reale reprezentate ca double

-1.57F, 3.14F constante reale reprezentate ca float

123456789.987654321L constante reale reprezentate ca long double

Declaratii

Declaratii: - de variabile

- de functii

Terminologie (concepte):

obiecte

lvalue

tipuri (de date)

declaratii de tip

clase de memorare

domenii (scope)

vizibilitate

durata

linkage

Definitie Obiect: o regiune identificabila de memorie care poate pastra o valoare fixa (constanta ) sau variabila.

OBS. Termenul de obiect definit mai sus nu trebuie confundat cu termenul omonim utilizat in programarea orientata obiect!

Fiecare obiect are: - un nume

- un tip

Prin nume se acceseaza obiectul (valoarea pastrata in obiect).

Numele este un identificator sau o expresie care indica obiectul. Un identificator poate fi format din litere (mici sau mari), cifre si _ (underscore). Orice identificator trebuie sa inceapa cu o litera sau cu _.

Utilizarea caracterului _ la inceputul unui identificator trebuie facuta cu grija, intrucat, acest caracter e utilizat si pentru simbolurile din functiile de biblioteca.

Exemple:

i, contor, a[5], a[i], *p, (p+5i), _Sin

Standardul ANSI C asigura unicitatea identificatorilor care sunt diferiti pe primiele 31 de caractere.

Prin tip:

se determina spatiul de memorie necesar pt obiectul in cauza

se precizeaza modul de reprezentare interna

Implicit, informatiile de mai sus determina plaja de valori pe care le poate retine obiectul respectiv. Tipul unui obiect este utilizat in generarea codului necesar manipularii obiectului respectiv.

In sensul definitiei de mai sus, obiecte sunt variabilele (care nu sunt create in registri!) si functiile.

Lvalue

Un lvalue este un identificator sau o expresie care desemneaza un obiect.

Un lvalue modificabil este un lvalue care identifica un obiect care poate fi accesat si modificat.

Exemplu de lvalue care nu este modificabil: o variabila declarata const.: const float pi=3.14;

O declaratie:

stabileste legatura intre identificator si obiectul pe care-l identifica.

asociaza un identificator cu un tip de data

Declaratiile pot fi :

de definire, care determina crearea unui obiect (alocarea de memorie si posibila sa initializare)

de referire, care aduce la cunostinta compilatorului existenta si tipul obiectului accesibil prin identificatorul precizat in declaratie.

OBS. Pot exista mai multe declaratii de referire a unui obiect (mai ales in programe constituite din mai multe fisiere sursa), dar una singura de definire.

OBS. In general un identificator nu poate fi utilizat (referit) inainte de declarare.

Exceptie: pot fi referite "inainte" (de declaratie) etichetele si functiile nedeclarate.

Declaratii de variabile (sintaxa)

Orice variabila trebuie decalarta inainte de prima utilizare.

Sintaxa declaratiilor de variabile este

Tip identificator1[, identificator2[, identificator3 [, ...]]];

Unde, in paranteze drepte sunt mentionate elementele optionale (care pot lipsi).

Tipurile de baza (fundamentale) in C sunt:

char, int , short , long, (tipuri intregi)

float, double, long double (tipuri reale)

Clase de memorare

Asocierea identificatorilor cu obiecte presupune ca fiecare identificator sa aiba cel putin doua atribute specificate:

clasa de memorare

tipul (datelor ce vor fi memorate - in cazul variabilelor, sau al datelor returnate - in cazul functiilor)

Clasa de memorare: specifica unde va fi creat obiectul si durata de viata a obiectului.

Un obiect poate fi creat in:

zona (segmentul) de date

registri

heap

stiva

Clasa de memorare poate fi determinata de locul de plasare a declaratiei in fisierul sursa sau de utilizarea modificatorilor de clasa de memorare.

In functie de locul in care apare declaratia in fisierul sursa clasa de memorare a unui obiect

auto (sau register, daca compilatorul e setat astfel incat sa poata crea variabile registru din proprie initiativa!) daca declaratia se face in interiorul unei functii (bloc - un bloc este u secventa de declaratii si instructiuni cuprinsa intre acolade),

static, daca declaratia este plasata in afara oricarei functii

Prin utilizarea modificatorilor de clasa de memorare, clasa de memorare a unui obiect poate fi:

auto obiectele cu aceasta clasa de memorare se creaza pe stiva Variabilele decalarte in interiorul unui bloc, numite si variabile locale au aceasta clasa de memorare.

register (nu este imperativ ci orientaiv!)

static - obiectele cu aceasta clasa de memorare se creaza in zona de date statice

extern aceasta clasa de memorare este tipica pentru obiectele declarate (create intr-un alt fisier sursa)

Utilizarea modificatorului static in declaratia unei variabile globale (sau a unei functii) "ascunde" variabila/functia respectiva in interiorul fisierului sursa in care apare.

Domeniul unui identificator

Reprezinta partea unui program in care identificatorul poate fi utilizat pentru a accesa obiectul pe care-l identifica. (ex. cu persoane cu acelasi prenume in familii diferite)

Tipuri de domenii:

bloc (local)

functie

prototip de functie

fisier (global)

Domeniul unui identificator depinde de locul si modul declararii.

Domeniul unui identificator cu domeniul bloc (local) incepe din locul declaratiei si pana la sfarsitul blocului in care a fost declarat. (acelasi domeniu il au si parametri din definitia unei functii)

Domeniul functie se refera doar la identificatorii utilizati ca etichete: etichetele pot fi utilizate in instructiuni goto oriunde in functia in care e declarata eticheta. Etichetele trebuie sa fie unice intr-o functie.

Domeniul prototip de functie este propriu identificatorilor din lista de parametri din prototipul (declaratia) unei functii si se termina la sfarsitul prototipului functiei.

Ex. Prototip de functie in care se folosesc denumiri de parametri diferite de cele din definitia aceleiasi functii!

Domeniul fisier (global) este tipic identificatorilor declarati in afara oricarui bloc.

Spatiul unui nume reprezinta domeniul in care un identificator trebuie sa fie unic.

Vizibilitatea

unui identificator reprezinta regiunea dintr-un program sursa de unde se poate accesa obiectul asociat identificatorului.

Domeniul include vizibilitatea (care poate fi insa mai restransa)

Durata

reprezinta perioada din executia unui program in care un identificator are asociat un obiect fizic (existent in memorie).

Se poate distinge deasemenea si intre obiecte existente in timpul compilarii (compile-time objects - ex. typedef-uri si tipuri) sau in timpul executiei (run-time objects- ex. variabile).

Durata poate fi:

statica (zona de date statica); dureaza pana la sfarsitul executiei

locala (stiva sau registru); dureaza pana la parasirea domeniul; trebuie initilizate explicit

dinamica (heap); create/distruse prin apel de functii specifice

Prin linkage se precizeaza legatura (asocierea) dintre fiecare instanta (aparitie in programul sursa) a unui identificator si obiectul care poate fi accesat prin intermediul lui. Un identificator poate avea linkage intern, extern sau de nici un fel.

Modificatori de declaratii

Anumite atribute ale variabilelor pot fi modificate (fata de valoarea implicita) prin utilizarea modificatorilor de declaratii. Acestia sunt cuvinte cheie care, utilizate intr-o declaratie modifica valoarea implicita a unui atribut al variabilelor/functiilor precizate in declaratie.

Modificatorul const

Precizeaza ca valoarea variabila declarate (si initializate!) nu poate fi modificata.

Ex.

const int origin=0; /*corect*/

cons int x=100, y; /*gresit: y trebuie initializat!*/

x=1000; /*gresit: x nu poate fi modificat!*/

y=1000; /*gresit: y nu poate fi modificat!*/

Modificatorii signed si unsigned

Modificatorii signed si unsigned se utilizeaza in declaratiile variabilelor/functiilor intregi pentru a specifica in mod explicit ca e vorba de intregi cu/fara semn, modificand valoarea implicita a acestui atribut.

Modificatorii de clasa de memorare

Modificatorii de clasa de memorare sunt:

static

auto

register

extern

Initializarea variabilelor pe linia de declaratie

Variabilele pot fi initializate pe linia de declaratie prin utilizarea operatorului de asignare (=). Expresiile care se folosesc pentru initializare trebuie sa fie de tipul declarat al variabilei care se initializeaza sau sa poata fi convertit la acest tip. Eventualele variabile care apar in expresii folosite ca initializatori trebuie sa fi fost deja definite!

Declararea si initializarea tablourilor

Sintaxa declaratiei unui tablou este:

TIP nume_tablou[ expr_constanta

sau

TIP nume_tablou[expr_constanta

OBS lista trebuie sa nu aiba mai multe elemente decat valoarea expr_constanta    iar elementele se separa prin virgula.

In absenta expr_constanta, numarul de elemente ale listei de initalizatori determina numarul de elemente ale tabloului.

Exemple:

int tab[10], a[5]=;

char judet[ ]="Timis";



Document Info


Accesari: 1209
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )