Sunteți pe pagina 1din 6

LUCRAREA NR.

2
TIPURI DE DATE Tipul unei date determin modul n care procesorul stocheaz i prelucreaz data respectiv. n limbajul C, exist dou tipuri de reprezentare pe care le putem numi principale: tipul ntreg i tipul real, fiecare avnd i anumite particularizri. Astfel, tipul ntreg (int) include i tipul caracter (char) iar tipul real (float) include i tipul real extins (double). Tipurile de date le vom reprezenta de la simplu la complex, n ordinea char, int, float, double. Tipurile de baz sunt char, int, float, double i cu ajutorul modificatorilor de tip putem obine diverse particularizri. Modificatorii pot fi signed, unsigned, short, long. Ca o generalitate, numerele sunt reprezentate intern lundu-se n considerare bitul de semn, deci implicit numerele ntregi sau reale au MSB bit de semn. Dac se specific explicit, prin modificatorul unsigned, nu se mai consider (interpreteaz) bitul de semn. 2.1. Tipul char Codul ASCII (American Standard Code for Information Interchange) este un cod de reprezentare a caracterelor. Prin caracter nelegem unitile de baz care se pot tasta (intrri de la tastatur), tipri la imprimant sau afia pe ecran. Dac se declar o dat de tip char, ea este considerat explicit de tipul signed char (cu MSB bit de semn), deci reprezentarea intern este de forma:
U U U U U U U U U U

b6

b5

b4

b3

b2

b1

b0

B it d e s e m n

Gama de reprezentare este cuprins ntre max = 27 1 = 127 [ 128, 127] min = 27 = 128 Dac se declar tipul unsigned char, atunci nu se mai consider (interpreteaz) bitul de semn i data se consider ntreag pozitiv, n gama max = 2 8 1 = 255 [0, 255] min = 0 ntregul alfabet al limbajului C se regsete n mulimea primelor 128 de caractere ASCII. Restul de 128 de caractere se mai numete i set de caractere extins ASCII i poate fi vizualizat printr-un program simplu. n tabelele de mai jos se prezint codificarea ASCII a caracterelor.
D 1 2 3 4 5 6 7 8 H 0 1 2 3 4 5 6 7 8 Sym Null D 16 17 18 19 20 21 22 23 24 H 10 11 12 13 14 15 16 17 18 Sym D 32 33 34 35 36 37 38 39 40 H 20 21 22 23 24 25 26 27 28 Sym ! " # $ % & ' ( D 48 49 50 51 52 53 54 55 56 H 30 31 32 33 34 35 36 37 38 Sym 0 1 2 3 4 5 6 7 8

9 10 11 12 13 14 15 D 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

9 a b c d e f H 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f

LF CR Sym @ A B C D E F G H I J K L M N O

25 26 27 28 29 30 31 D 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

19 1a 1b 1c 1d 1e 1f H 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f

Sy m P Q R S T U V W X Y Z [ \ ] ^ _ D

41 42 43 44 45 46 47

29 2a 2b 2c 2d 2e 2f H 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f

) * + , . / Sy m ` a b c d e f g h i j k L M N O D 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

57 58 59 60 61 62 63 H 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f

39 3a 3b 3c 3d 3e 3f

9 : ; < = > ?

Sym p q r s t u v w x y z { | } ~

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

Exemplu: Urmatorul program afiseaza caracterul A i caracterul B:


#include <stdio.h> void main() { char c1,c2; c1=65; c2=B; printf("%c %c",c1,c2); }

2.2. Tipul int Acest tip se folosete pentru reprezentarea numerelor ntregi cu sau fr semn. Tipul int este identic cu signed int i utilizeaz o reprezentare pe 4B a numerelor ntregi cu semn. Reprezentarea pe 4 octei duce la posibilitatea mririi gamei de reprezentare astfel:
max = 2 31 1 3 3 ; 2 31 = 2 2 30 = 2 210 2 10 3 2 10 9 min = 2 31

( )

( )

Rezult c putem reprezenta numere ntregi n gama: unsigned int nu va mai lua n considerare bitul de semn, astfel nct reprezentarea intern este de forma din figura de mai jos. Evident,

[ 2.1475 10 ] [ 2 10
9

, 2 10 9

max = 2 32 1 3 3 ; 2 32 = 4 2 30 = 4 210 4 10 3 4 10 9 min = 0

( )

( )

Gama de reprezentare se poate schimba cu ajutorul modificatorilor short sau long.


MSB S b 14 b0 LSB

short int se va reprezenta pe 2B, sub forma


max = 215 1 ; 215 = 2 5 210 = 32 210 [ 32768, 32767 ] . 15 min = 2 unsigned short int va schimba gama de reprezentare n [0, 65535] long int se va reprezenta pe 8B i va conduce la o gam imens de reprezentare a numerelor ntregi, lucru dovedit de
6 2 63 = 2 3 210 8 1018 = 9.2234 1018

( )

unsigned long int va considera numai numere ntregi pozitive n gama 0, 1.844 1019 . Urmtorul program arat o posibil eroare dac se utilizeaz specificatorii de format greii.
#include <stdio.h> void main() { unsigned int a; a=42000; printf("Afiseaza 42000 ca unsigned %u\n",a); printf("Afiseaza 42000 ca int %d",a); }

Deci, tipul unei variabile definete intervalul de valori pe care le poate lua o variabil. Variabilele de tip int pot lua valori ntre 32768 i 32767. Dac se atribuie o valoare n afara acestui interval apare o eroare de depire. Urmtorul program arat cum apare situaia de depire.
#include <stdio.h> void main() { int pozitiv=32767; int negativ=-32768; printf(%d + 1 este %d,pozitiv,pozitiv+1); printf(\n%d - 1 este %d,negativ,negativ-1); }

2.3. Tipul float Acest tip de reprezentare este de tip real, fiind cunoscut i ca reprezentare n virgul mobil (floating point). Acest tip descrie mecanismul de baz prin care se manipuleaz datele reale. n limbajul C se disting trei tipuri de date reale: - float , cu reprezentare pe 4 octei (32 bii, double word) 3

double, cu reprezentare pe 8 octei (64 bii, quad word) long double, cu reprezentare pe 10 octei (80 bii, ten word)

Urmatorul program realizeaza afisarea unui numar real in format parte_intreaga.parte_fractionara exponent.
#include <stdio.h> void main() { double a; a=22.75; printf("%.2e",a); }

2.4 Secvene escape Secvenele escape sunt combinaii speciale de caractere formate din whitespace i caractere negrafice constituite n iruri i constante caracter. Ele sunt n mod tipic utilizate pentru a specifica aciuni precum carriage return i tab pe terminale i imprimante i pentru a furniza reprezentarea caracterelor care normal au neles special, cum ar fi ghilimelele (). O secven escape const dintrun backslash urmat de o liter sau combinaii de cifre. Setul complet de secvene escape cuprinde: \a caracterul BEL - activare sunet \b caracterul BS (backspace) - revenire cu un spaiu \f caracterul FF (form feed) - salt de pagin la imprimant \n caracterul LF (line feed) - rnd nou \r caracterul CR (carriage return) - revenire la coloana 1 \t caracterul HT (horizontal tab) - tab orizontal \v caracterul VT (vertical tab) - tab vertical \\ caracterul \ (backslash) \" caracterul " (double qoute) - ghilimele \' caracterul ' (single qoute) - apostrof \0 caracterul NULL \ooo - constant octal \xhh - constant hexazecimal Backslash-ul care precede un caracter neinclus n lista de mai sus este ignorat i acest caracter este reprezentat ca un literal. De exemplu, forma \c reprezint caracterul c ntr-un literal sau ntr-o constant caracter. Secvenele \ooo i \xdd permit scrierea oricrui caracter din setul ASCII ca un numr octal format din trei cifre sau ca un numr hexagesimal format din dou cifre. '\6' '\x6' 6 ASCII '\60' '\x30' 48 ASCII '\137' '\x5f' 95 ASCII Numai cifrele octale (de la 0 la 7) pot apare ntr-o secven escape octal i trebuie s apar cel puin o cifr. De exemplu, caracterul backspace poate fi scris ca \10 n loc de \010. Similar, o secven hexagesimal poate s conin cel puin o cifr, iar a doua cifr poate fi omis. Totui, cnd se utilizeaz secvene escape n iruri, este indicat s se scrie toate cele trei cifre ale secvenei. Altfel, caracterul care urmeaz dup secvena escape ar putea fi interpretat ca o parte a secvenei, dac se ntmpl s fie o cifr octal sau hexagesial. De exemplu, secvena \0331 este Exemplu:

interpretat drept ESC i 1. Dac am scrie \331, omind primul zero, atunci am avea o interpretare greit. Secvenele escape permit caractere de control negrafice pentru a fi transmise ctre display. Caracterele negrafice trebuie totdeauna reprezentate ca secvene escape. Plasnd necorespunztor un caracter negrafic n programe C, el are rezultat imprevizibil. De exemplu, programul urmtor prezint utilizarea sunetului:
#include <stdio.h> void main() { printf ("beep at end of message\007\n"); }

2.5. Operatori aritmetici Lista operatorilor aritmetici este urmtoarea: + reprezint operatorul plus unar sau binar, n funcie de context - reprezint operatorul minus unar sau binar, n funcie de context * reprezint operatorul de nmulire (binar) / reprezint operatorul de mprire (binar) % reprezint operatorul modulo (binar) Operandul operatorului unar plus trebuie s fie de tip aritmetic sau pointer, iar rezultatul este valoarea operandului. Un operand ntreg presupune o promovare a ntregilor. Operandul operatorului unar minus trebuie s fie de tip aritmetic, iar rezultatul este numrul negativ corespunztor. Un operand ntreg presupune promovarea ntregilor. Operanzii operatorilor * i / trebuie s fie de tip aritmetic, iar ai lui % trebuie s fie de tip ntreg. Operatorul binar / reprezint ctul, iar % ofer restul mpririi primului operand la al doilea. Dac al doilea operand al operatorului / sau % este zero, rezultatul este nedefinit. Pentru operanzi de tip ntreg este adevrat egalitatea: (a / b) * b + a % b = a n expresii operatorii binari + i - au aceeai preceden, care ns este mai mic dect a grupului *, / i %. Precedena ultimului grup este mai mic dect cea a operatorilor unari + i -. Folosirea parantezelor n expresii poate schimba precedena ntre operatori n timpul evalurii acestora. Exemplu: Dac a, b, c, d sunt variabile de tip int, atunci: - expresia d * b % a este echivalent cu (d * b) % a; - expresia -a / d este echivalent cu (-a) / d; - expresia a=b=c=d-15 este echivalent cu a=(b=(c=(d -15))); - expresia a%-b*c este echivalent cu (a%(-b))*c; 2.6. Operatori de incrementare i decrementare n C, operaiile de forma i = i+1 i j = j-1 pot fi programate folosind doi operatori unari specifici i anume ++ pentru incrementare cu 1 i -- pentru decrementare cu 1. Aceti operatori pot fi folosii att ca prefix pentru variabile (de exemplu, ++i, --j) sau ca sufix (i++, j--). ntre aceste moduri de utilizare exist diferene. Astfel, n expresia ++i, variabila i este incrementat nainte de a-i folosi valoarea, n timp ce n expresia i++, variabila i este incrementat dup ntrebuinarea valorii acesteia. 5

Exemplu:

Considerm secvena: x = 10; y = ++x; Dac se afieaz y, atunci vom gsi y = 11 deoarece mai nti se incrementeaz x i apoi se atribuie valoarea lui y. Dac scriem: x = 10; y = x++; vom gsi y=10 (mai nti se face atribuirea lui x la y i apoi incrementarea lui x). Precedena tuturor operatorilor aritmetici este: nalt Sczut ++ -+ - (unari) * / % + - (binari)

Operatorii de aceeai preceden sunt evaluai de al stnga la dreapta. TEME: 1. Sa se realizeze un program ce afieaz toate caracterele tipribile ale codului ASCII. 2. S se realizeze un program care realizeaz suma i produsul a dou numere de ordinul milioanelor utiliznd toate tipurile de date int. 3. S se realizeze un program ce primete la intrare un numr n baza 10 i afieaz numrul respectiv n baza 2.