Lucrarea 2 – Structura unui program: date si instructiuni Reprezentarea numerelor in
bazele 2, 8, 10, 16. Reprezentarea numerelor cu semn in calculator.

Desfasurare :
Introducere –10 minute
Structura unui program –15- min
Baza de numeratie 2 – 15 min
Reprezentarea numerelor cu semn in complement de 2– 15 min
Baza de numeratie 8 (octal) si 16 (hexazecimal) –15 min
Rulare programe de conversie – 20 min
Intrebari, explicatii suplimentare, daca e cazul – 10 min


Introducere
La laborator se va folosi Dev CPP –ul (versiunea 4.9.9.2) ca mediu integrat de dezvoltare
(IDE). Pentru detalii despre utilizarea acestuia, consultati documentul XXXX,
Un program C se construieste in jurul functiei principale, functia main(). Aceasta functie
este apelata automat la rularea programului. Un prim program:
#include <stdio.h> //comentariu: stdio este o biblioteca unde se
gaseste functia printf, ca sa putem sa o apelam, mai jos
int main(void)
{
      printf(“Primul program“);
}
Incercati sa rulati programul fara prima linie. Ce se intampla?
#include <stdio.h>       copiaza aici continutul fisierului stdio.h.



Structura unui program
Deocamdata ne vom referi doar la functia principala, main().
Rulati urmatoarele programe in C; identificati liniile unde se declara date si cele cu
instructiuni. Incercati sa inversati linia 1 cu linia 3. Ce se intampla? Explicati.
a)
#include <stdio.h>
#include <stdlib.h> // pt apelul sistem pause
int main(void)
{
      int a, b, c; // linia 1
      long int s;
      printf("Dati numerele, despartite prin spatii albe (spatiu, tab,
enter, etc) "); // linia 3
      scanf(" %d %d %d", &a, &b, &c);
      s=a+b+c;
      printf("suma este");
      printf(" %d", s);
      getchar(); //ca sa vedem rezultatele
}
b)
#include <stdio.h>
int main(void)
{
      int a=1, b=2, c=3;
      long int s;
      s=a+b+c;
      printf(“suma este”);
      printf(“ %d”, s);
      getchar(); //ca sa vedem rezultatele
}
c)
#include <stdio.h>
#define a 1
#define b 2
#define c 3
int main(void)
{
      long int s;
      s=a+b+c;
      printf(“suma este”);
      printf(“ %d”, s);
      system("pause"); // ca sa vedem rezultatele
}



Baza de numeratie 2
Cifrele bazei 2: 0 si 1.
Ordinea unei cifre are aceeasi semnificatie ca si in baza 10, adica da ordinul de marime:
                         (1100)2 = 1*23 + 1*22 + 0*21 +0*20 = (12)10
Formula de mai sus ne da transformarea din baza 2 in baza 10, cea in care suntem
obisnuiti sa lucram. Exemplu este dat, pt simplitate, cu 4 cifre, dar in calculator nu putem
memora mai putin de 8 cifre binare ( 8 biti), adica un octet (byte). Pt a otine numarul
echivalent format din 8 cifre binare, vom adauga in fata numarului 4 cifre de 0.
Transformarea din baza 10 in baza 2 se face prin impartiri succesive, pana catul=0.
Numarul va fi format de resturile partiale, in sens invers de cum le-am obtinut. Pt a
completa pana la multiplu de octet, se pun in fata 0-uri nesemnificative.
            13 : 2 = 6 | 1
            6:2= 3 | 0
            3:2= 1 | 1
            1 : 2 = 0 | 1 - cel mai semnificativ bit (MostSemnificativBit)
             (13)10 = (1101)2 = (00001101)2 (am completat cu 0-uri nesemtif.)

Operatii in baza 2
Operatiile in baza 2 se efectueaza ca si operatiile in baza 10
Ex.
 11010011 +                 = 27 +26 +24 +21 +20 = (211)10
 10010000
 --------
101100011
Atentie!! Dupa cum se observa, pt a memora rezultatul avem nevoie de 9 cifre. Pe hartie
putem sa mai adaugam o cifra, dar in calculator cea de-a 9-a cifra va fi pierduta daca
numarul nostru ocupa doar 1 octet. De aceea trebuie sa aveti grija, sa va ganditi ca de
regula suma sau produsul a 2 numere sunt mai mari decat numerele. Acesta este doar un
exemplu de depasire a memoriei alocate. O sa vedem mai incolo ca depasire putem avea
si in alte cazuri
Celelalte operatii de baza se fac la fel.
Probleme
     1. Faceti urmatoarele transformari:
             - in baza 10: (11001001)2 (10000000)2
             - in baza 2: (16)10,(42)10, (123)10, (256)10
     2. Efectuati urmatoarele operatii in baza 2:
            11001001 + 00011111 ; 11101100 + 10000000
            1100 * 0110
            1100  0110 (prin scaderi repetate)

Pentru a reprezenta si numere negative in baza 2 se foloseste complementul de 1 si
complementul de 2. Mai jos este prezentata cea de-a 2 modalitate deoarece aceasta se
foloseste pt reprezentarea numerelor negative in calculator (complementul de 2 ne
permite sa memoram pe 1 octet [-128 – 127], complementul de 1 [-127 – 127] )


Reprezentarea numerelor cu semn in complement de 2
Pentru numerele pozitive, reprezentarea în complement faţă de 2 este cea prezentata mai
sus pentru numere fara semn. Pentru numerele negative, primul bit este 1, valoarea
numarului in baza 10 obtinandu-se prin scaderea lui 2N (N=nr de biti). Simetric, pentru a
transforma din baza 10 in baza 2, vom adauga 2N la numarul negativ si vom transforma
numarul astfel obtinut in baza 2, dupa algoritmul expus mai sus.
pt. N=8 avem 13 =(00001101)2
        –13 este 28 + (–13) = 256 - 13 = 243 = (11110011)2

Probleme
  3. Faceti urmatoarele transformari, pt numere cu semn:
        - in baza 10: (11001001)2 (10000000)2
        - in baza 2: (-16)10,(-42)10, (-123)10, (-256)10
  4. Efectuati urmatoarele operatii in baza 2 (transformati
      numerele in zecimal, tinand cont ca sunt cu semn, apoi
      faceti operatiile si transformati rezultatul, pt
      verificare):
       11001001 + 00011111 ; 11101100 + 10000000
       1100 * 0110
       1100  0110 (prin scaderi repetate)


Baza de numeratie 8 (octal) si 16 (hexazecimal)
baza 8 = {0,1,2,3,4,5,6,7 }
baza 16 = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F }, unde A=10, B=11, ...., F=15
Cele 2 baze se folosesc mai des deoarece e mai usor de transformat in/din baza 2: unei
cifre in octal ii corespund 3 cifre binare, iar unei cifre in hexa ii corespund 4 cifre binare.
                                    (1100)2 = (C)16 = (12)10
(11010011)2 = (D3)165 = D*161 + 3*160 = 208 + 3 = (211)10
Probleme
    5. Faceti urmatoarele transformari, pt numere cu semn:
            - in baza 10: ()16 ()8
            - in baza 2: (-16)8,(-47)8, (-123)16, (-256)16
            - in baza 16: (10010000)2, (11001001)2, (10000000)2
            - in baza 8: (10010000)2
    6. Efectuati urmatoarele operatii in baza 2 (transformati
         numerele in zecimal, tinand cont ca sunt cu semn, apoi
         faceti operatiile si transformati rezultatul, pt
         verificare):
           11001001 + 00011111 ; 11101100 + 10000000


Rulare programe de conversie
Scrieti urmatoarele programe si rulati-le, pt a va verifica transformarile facute mai sus.
Studiati corpul functiei main().
7.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{     // conversie 10 -> 16, 8, 2 (prin impartiri succesive)
       int a, rest;
       printf("Dati numarul in baza 10: ");
       scanf("%d", &a);
       printf("numarul in baza 16 este");
       printf(" %xn", a);
    printf("numarul in baza 8 este %on", a);
    printf("numarul in baza 2 este (in ordine inversa): ");
    rest=a;
    while (a)
    {
           rest=a%2;
           printf("%d", rest);
           a=a/2;
    }
    printf("n");
    system("pause");
}
8.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{    // conversie 8 -> 16, 10, 2
      unsigned int a, masca, nr_biti;
      int i;
printf("Dati numarul in baza 8: ");
      scanf("%o", &a);
      printf("numarul in baza 16 este");
      printf(" %xn", a);
    printf("numarul in baza 10 este %dn", a);

    nr_biti = sizeof(int)*8;
    printf("nNumarul ocupa %d octeti, adica %d bitin", sizeof(int),
nr_biti);
    printf("numarul in baza 2 este (in ordinea corecta): ");

    masca = 1 << (nr_biti - 1);

    for(i=(nr_biti-1) ; i>=0; --i)
    {

            printf("%d",(masca&a)>>i);
            masca = masca >> 1;
    }
    printf("n");
    system("pause");
}

Lucr2

  • 1.
    Lucrarea 2 –Structura unui program: date si instructiuni Reprezentarea numerelor in bazele 2, 8, 10, 16. Reprezentarea numerelor cu semn in calculator. Desfasurare : Introducere –10 minute Structura unui program –15- min Baza de numeratie 2 – 15 min Reprezentarea numerelor cu semn in complement de 2– 15 min Baza de numeratie 8 (octal) si 16 (hexazecimal) –15 min Rulare programe de conversie – 20 min Intrebari, explicatii suplimentare, daca e cazul – 10 min Introducere La laborator se va folosi Dev CPP –ul (versiunea 4.9.9.2) ca mediu integrat de dezvoltare (IDE). Pentru detalii despre utilizarea acestuia, consultati documentul XXXX, Un program C se construieste in jurul functiei principale, functia main(). Aceasta functie este apelata automat la rularea programului. Un prim program: #include <stdio.h> //comentariu: stdio este o biblioteca unde se gaseste functia printf, ca sa putem sa o apelam, mai jos int main(void) { printf(“Primul program“); } Incercati sa rulati programul fara prima linie. Ce se intampla? #include <stdio.h> copiaza aici continutul fisierului stdio.h. Structura unui program Deocamdata ne vom referi doar la functia principala, main(). Rulati urmatoarele programe in C; identificati liniile unde se declara date si cele cu instructiuni. Incercati sa inversati linia 1 cu linia 3. Ce se intampla? Explicati. a) #include <stdio.h> #include <stdlib.h> // pt apelul sistem pause int main(void) { int a, b, c; // linia 1 long int s; printf("Dati numerele, despartite prin spatii albe (spatiu, tab, enter, etc) "); // linia 3 scanf(" %d %d %d", &a, &b, &c); s=a+b+c; printf("suma este"); printf(" %d", s); getchar(); //ca sa vedem rezultatele } b) #include <stdio.h>
  • 2.
    int main(void) { int a=1, b=2, c=3; long int s; s=a+b+c; printf(“suma este”); printf(“ %d”, s); getchar(); //ca sa vedem rezultatele } c) #include <stdio.h> #define a 1 #define b 2 #define c 3 int main(void) { long int s; s=a+b+c; printf(“suma este”); printf(“ %d”, s); system("pause"); // ca sa vedem rezultatele } Baza de numeratie 2 Cifrele bazei 2: 0 si 1. Ordinea unei cifre are aceeasi semnificatie ca si in baza 10, adica da ordinul de marime: (1100)2 = 1*23 + 1*22 + 0*21 +0*20 = (12)10 Formula de mai sus ne da transformarea din baza 2 in baza 10, cea in care suntem obisnuiti sa lucram. Exemplu este dat, pt simplitate, cu 4 cifre, dar in calculator nu putem memora mai putin de 8 cifre binare ( 8 biti), adica un octet (byte). Pt a otine numarul echivalent format din 8 cifre binare, vom adauga in fata numarului 4 cifre de 0. Transformarea din baza 10 in baza 2 se face prin impartiri succesive, pana catul=0. Numarul va fi format de resturile partiale, in sens invers de cum le-am obtinut. Pt a completa pana la multiplu de octet, se pun in fata 0-uri nesemnificative. 13 : 2 = 6 | 1 6:2= 3 | 0 3:2= 1 | 1 1 : 2 = 0 | 1 - cel mai semnificativ bit (MostSemnificativBit) (13)10 = (1101)2 = (00001101)2 (am completat cu 0-uri nesemtif.) Operatii in baza 2 Operatiile in baza 2 se efectueaza ca si operatiile in baza 10 Ex. 11010011 + = 27 +26 +24 +21 +20 = (211)10 10010000 -------- 101100011
  • 3.
    Atentie!! Dupa cumse observa, pt a memora rezultatul avem nevoie de 9 cifre. Pe hartie putem sa mai adaugam o cifra, dar in calculator cea de-a 9-a cifra va fi pierduta daca numarul nostru ocupa doar 1 octet. De aceea trebuie sa aveti grija, sa va ganditi ca de regula suma sau produsul a 2 numere sunt mai mari decat numerele. Acesta este doar un exemplu de depasire a memoriei alocate. O sa vedem mai incolo ca depasire putem avea si in alte cazuri Celelalte operatii de baza se fac la fel. Probleme 1. Faceti urmatoarele transformari: - in baza 10: (11001001)2 (10000000)2 - in baza 2: (16)10,(42)10, (123)10, (256)10 2. Efectuati urmatoarele operatii in baza 2: 11001001 + 00011111 ; 11101100 + 10000000 1100 * 0110 1100 0110 (prin scaderi repetate) Pentru a reprezenta si numere negative in baza 2 se foloseste complementul de 1 si complementul de 2. Mai jos este prezentata cea de-a 2 modalitate deoarece aceasta se foloseste pt reprezentarea numerelor negative in calculator (complementul de 2 ne permite sa memoram pe 1 octet [-128 – 127], complementul de 1 [-127 – 127] ) Reprezentarea numerelor cu semn in complement de 2 Pentru numerele pozitive, reprezentarea în complement faţă de 2 este cea prezentata mai sus pentru numere fara semn. Pentru numerele negative, primul bit este 1, valoarea numarului in baza 10 obtinandu-se prin scaderea lui 2N (N=nr de biti). Simetric, pentru a transforma din baza 10 in baza 2, vom adauga 2N la numarul negativ si vom transforma numarul astfel obtinut in baza 2, dupa algoritmul expus mai sus. pt. N=8 avem 13 =(00001101)2 –13 este 28 + (–13) = 256 - 13 = 243 = (11110011)2 Probleme 3. Faceti urmatoarele transformari, pt numere cu semn: - in baza 10: (11001001)2 (10000000)2 - in baza 2: (-16)10,(-42)10, (-123)10, (-256)10 4. Efectuati urmatoarele operatii in baza 2 (transformati numerele in zecimal, tinand cont ca sunt cu semn, apoi faceti operatiile si transformati rezultatul, pt verificare): 11001001 + 00011111 ; 11101100 + 10000000 1100 * 0110 1100 0110 (prin scaderi repetate) Baza de numeratie 8 (octal) si 16 (hexazecimal)
  • 4.
    baza 8 ={0,1,2,3,4,5,6,7 } baza 16 = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F }, unde A=10, B=11, ...., F=15 Cele 2 baze se folosesc mai des deoarece e mai usor de transformat in/din baza 2: unei cifre in octal ii corespund 3 cifre binare, iar unei cifre in hexa ii corespund 4 cifre binare. (1100)2 = (C)16 = (12)10 (11010011)2 = (D3)165 = D*161 + 3*160 = 208 + 3 = (211)10 Probleme 5. Faceti urmatoarele transformari, pt numere cu semn: - in baza 10: ()16 ()8 - in baza 2: (-16)8,(-47)8, (-123)16, (-256)16 - in baza 16: (10010000)2, (11001001)2, (10000000)2 - in baza 8: (10010000)2 6. Efectuati urmatoarele operatii in baza 2 (transformati numerele in zecimal, tinand cont ca sunt cu semn, apoi faceti operatiile si transformati rezultatul, pt verificare): 11001001 + 00011111 ; 11101100 + 10000000 Rulare programe de conversie Scrieti urmatoarele programe si rulati-le, pt a va verifica transformarile facute mai sus. Studiati corpul functiei main(). 7. #include <stdlib.h> #include <stdio.h> int main(void) { // conversie 10 -> 16, 8, 2 (prin impartiri succesive) int a, rest; printf("Dati numarul in baza 10: "); scanf("%d", &a); printf("numarul in baza 16 este"); printf(" %xn", a); printf("numarul in baza 8 este %on", a); printf("numarul in baza 2 este (in ordine inversa): "); rest=a; while (a) { rest=a%2; printf("%d", rest); a=a/2; } printf("n"); system("pause"); } 8. #include <stdlib.h> #include <stdio.h> int main(void) { // conversie 8 -> 16, 10, 2 unsigned int a, masca, nr_biti; int i;
  • 5.
    printf("Dati numarul inbaza 8: "); scanf("%o", &a); printf("numarul in baza 16 este"); printf(" %xn", a); printf("numarul in baza 10 este %dn", a); nr_biti = sizeof(int)*8; printf("nNumarul ocupa %d octeti, adica %d bitin", sizeof(int), nr_biti); printf("numarul in baza 2 este (in ordinea corecta): "); masca = 1 << (nr_biti - 1); for(i=(nr_biti-1) ; i>=0; --i) { printf("%d",(masca&a)>>i); masca = masca >> 1; } printf("n"); system("pause"); }