




























































































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Informatica generale - Linguaggio C dispensa completa per l'esame di informatica generale prof. Moscato Bicocca Milano
Tipologia: Dispense
1 / 155
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





























































































Se il numero ha una parte decimale, svolgete il calcolo separatamente: la somma degli addendi, nella
parte decimale, non supererà mai il valore 1.
2
= 1 * 0,25 + 1 * 0,0625 =0, 10
= 15 * 0,0625 + 1 * 0,0039 = 0,9375 + 0,0039 = 0,9414 10
Perciò:
2
10
E.1.1. Esercizi proposti. Convertire in base 10
2
4
12
2
1.3. Conversione di numeri dalla base 10 in una base qualunque: numeri interi
Per capire, partiamo da un esempio sciocco:
Convertire il numero 135 10
in un numero in base 10.
Da dividere per 10 Resto
Risultato (si legge dal basso in alto): 135 10
Facciamo ora esercizi più seri! (ma il trucco sarà identico, tenendo conto della diversa base).
Convertire 124 10 in base 2:
Da dividere per 2 Resto
10
2
Infatti:
2
10
Convertire 124 10
in base 16:
Da dividere per 16 Resto
7 C (cioè 12 !)
Convertire 212 10 in base 7:
Da dividere per 7 Resto
Convertire 538 10 in base 12:
Da dividere per 12 Resto
44 A (cioè 10 !)
10
12
Convertire 555 10
in base 5:
Da dividere per 5 Resto
10
5
1.4. Conversione di numeri dalla base 10 in una base qualunque: numeri
frazionari
Per capire, partiamo ancora da un esempio sciocco:
Convertire il numero 0,901 10 in base 16:
Da moltiplicare per 16 Parte intera
0,416 E (cioè 14 !)
0,496 A (cioè 10 !)
0,936 7 (etc.)
Convertire il numero 0, 10
in base 5:
Da moltiplicare per 5 Parte intera
0,875 1 (etc.)
E.1.2. Esercizi proposti. Convertire i seguenti numeri in base 10 nelle basi indicate:
108610 = in base 2
10
= in base 4
1234510 = in base 16
33310 = in base 3
10
= in base 2
678,8125 10 = in base 16
10
= in base 8
1.5. Conversione tra basi diverse dalla base 10
Agiamo con semplicità:
convertiamo il numero nella base 10;
lo riconvertiamo nella nuova base.
Entrambe sono operazioni che sappiamo fare.
Esercizio: convertire il numero 166 7 nella base 5:
2
1
0
= 1 * 49 + 6 * 7 + 6 * 1 = 97 10
Ora convertiamo 97 10
in base 5:
Da dividere per 5 Resto
Caso particolare: conversione tra basi che sono potenze di 2 (2, 4, 8, 16 etc.)
In questo caso, la conversione intermedia sarà quella in base 2, come vedremo. Occorre però una
riflessione iniziale.
Osserviamo nuovamente le tabelle che avevo mostrato all'inizio: ora però nella colonna a sinistra
metto la codifica in base 2
Base 2 Base 2 Base 2 Base 4 Base 2 Base 8 Base 2 Base 16
Per passare da queste basi alla base 2, sarà sufficiente sostituire ogni cifra esattamente con la propria
rappresentazione nelle tabelle viste.
Ad esempio:
8
2
(ovviamente il primo 0 è inutile)
16
2
Ed ora, per passare dalla base 2 alle altre basi, occorrerà raggruppare il numero in gruppi di:
2 cifre per la base 4
3 cifre per la base 8
4 cifre per la base 16
etc.
aggiungendo eventualmente degli 0 a sinistra.
Ad esempio:
2
2
8
Ed ora possiamo fare i passaggi di base qualsiasi (tra basi potenza di 2).
Riporti 1 1 1
4
4
4
7
7
Riporti 0 1
Riporti 0 1 1 1
16
16
16
12
12
Riporti 0 1
E.1.4. Esercizi proposti. Eseguire la somma nelle basi indicate.
2
2
8
8
12
12
1.7. Differenza in base qualsiasi
Rinfreschiamoci le idee con la base 10.
A. 9 - 2 = 7 → scrivo 7
→ prestito 0
B. 5 - 8 = - 3 → chiedo un prestito alla decina successiva
→ scrivo 7 - prestito di (-1)
C. - 1 + 7 - 8 = - 2 → chiedo un prestito alla decina successiva
→ scrivo 8 - prestito di (-1)
D. - 1 + 9 = 8 → scrivo 8
Riassumendo:
Prestiti - 1 - 1 0
Nota utile: ricordate che, nella differenza tra due numeri, i prestiti non sono mai minori di - 1.
Vediamo ora in una base qualunque.
2
2
Prestiti 0 0 - 1 - 1 0 0
(ed infatti 1010001 2 - 11012 = 81 - 13 = 68 10 )
Prestiti - 1 - 1
5
5
Prestiti - 1 - 1
5
5
5
0 0 0 0 0 0 0 - (riga inutile !)
4
4
(Nota: gli esercizi aggiuntivi sono dopo la divisione)
1.9. Divisione in base qualsiasi
Si procede in modo analogo a quanto si fa coi numeri in base 10.
Esempio:
4
4
A. Il 3 nell'1 non ci sta
B. Il 3 nel 12 (pari a 6 10 ) ci sta 2 volte resto 0
C. Il 3 nel 2 non ci sta
D. Il 3 nel 21 (pari a 9 10
) ci sta 3 volte resto 0
4
4
4
Nota: come vedete, la situazione è piuttosto complessa. Se dovete fare a mano una divisione
complicata, probabilmente vi conviene ricondurre entrambi gli operandi in base 10 (e qui definire la
precisione, con particolare riferimento alle cifre significative dopo la virgola) e poi riconvertire il
risultato nella base voluta.
E.1.6. Esercizi proposti. Moltiplicazione e divisione in base qualsiasi
Fare la tabellina della base 16 (Controllate i risultati, ricordando che le tabelline sono simmetriche
rispetto alla diagonale).
16
16
8
8
Da qui in poi si procede a spanne, ma con un'approssimazione più che sufficiente per i nostri scopi (e
comunque per difetto).
17
= 128 k
18
= 256 k
19
= 512 k
20
= 1024 k = 1 M
21
= 2 M
22
= 4 M
23
= 8 M
24
= 16 M
25
= 32 M
26
= 64 M
27
= 128 M
28
= 256 M
29
= 512 M
30
= 1024 M = 1 G
31
= 2 G
32
= 4 G
Capito il trucco? (
10
= 1 k; 2
20
= 1 M; 2
30
= 1 G; 2
40
= 1 T; etc.)
Ora però dobbiamo codificare i numeri interi, che sono positivi e negativi: quali potremo codificare?
Per capirlo, procediamo con l'esempio di un registro di 8 bit (c'è posto per 2
8
= 256 numeri)
Bit che mi avverte del segno: 0 = positivo (o nullo)
1 = negativo
Quindi:
Per i numeri positivi (oltre allo 0) ho a disposizione 7 bit = 128 numeri:
da 0
a 127 = 2
(8-1)
con una codifica corrispondente all'algebra binaria.
Per i numeri negativi ho a disposizione 7 bit = 128 (quelli con l'1 nel bit a sinistra)
da - 1 a - 128. (uno in più dei positivi, perché lo zero non è né positivo né negativo.
Però il numero - 128 è un po' particolare per un motivo che vi spiegherò
fra poco).
Conclusione:
Codificheremo con registri a n bit numeri che, in valore assoluto, siano minori o uguali di:
(n-1)
Ma quale codifica useremo per i numeri negativi?
1.11. Il complemento a due
1.11.1. Definizione
La vediamo con un esempio: - (^310)
Si consideri il valore positivo:
Eseguiamo ora la differenza col seguente numero a 9 bit:
(Assomiglia molto al trucco dei "prestiti" visto nell'esercitazione precedente...)
1.11. 2. Metodo più semplice
A. si codifica il valore assoluto del numero
B. si fa il "complemento a 1", è cioè si complementa ciascun bit (gli 0 diventano 1, gli 1
diventano 0)
C. si aggiunge 1
Esempio: - 3 10
10
Altro esempio: - (^110)
10
1.11. 3. Qual'è il vantaggio?
Il fatto di trasformare tutte le sottrazioni in semplici addizioni!
Ad esempio: 7 10
10
10
10
Quindi:
Sommo a + (-b)
c = a - b = 000110 (infatti 19 - 13 = 6)
1.12.5. Usando gli stessi valori per a e b, eseguire ora c = b - a
Risposta:
Calcolo - 010011
Sommo b + (-a)
In questo caso non c'è stato il riporto di 1 a sinistra del registro: però il numero risulta negativo (a 1 il
bit che indica il segno). Ma sarà giusto? Proviamo a calcolare il valore assoluto:
cioè 6 10.
c = b - a = 111010 (infatti 13 - 19 = - 6)
1.12.6. Facciamo ora la somma di due numeri negativi, usando il complemento a 2.
a = - 3 10
b = - (^610)
c = a + b
Risposta:
Siccome il risultato vale - 9, avrò bisogno di un registro a 5 bit (
(5-1)
10
10
c = a + b (1) 1 0 1 1 1
E' un numero negativo, ma sarà giusto? Vediamo il suo valore assoluto:
E.1.7. Esercizi proposti.
Quanti bit sono sufficienti per codificare numeri interi tra - 100 e + 100? E tra - 5000 e +5000?
Con registri a 16 bit, quale sottoinsieme dei numeri interi posso codificare?
Codifica il numero - 25 in complemento a 2
Codifica il numero - 15 in complemento a 2
Esegui la sottrazione tra i seguenti numeri, usando la tecnica del complemento a 2: 0110011 -
I seguenti numeri sono codificati in complemento a 2: esegui la somma e controlla il risultato:
Esegui la somma di questi due numeri negativi e calcola il valore assoluto del risultato: 1111
1.13. Il problema dell' overflow
Sommando numeri con lo stesso segno, posso uscire dall'insieme di definizione con cui avevo codificato
i numeri.
Esempio (codifica con 8 bit, valori tra - 12710 e + 127 10 ):
risulta cioè negativo e pari a: - 122 10
(privo di significato !)
Si ha overflow quando:
somma di numeri positivi dà un risultato negativo;
somma di numeri negativi dà un risultato positivo.
Esempio:
Il risultato è scorretto.
Se avessimo voluto egualmente fare la somma, avremmo dovuto ridefinire il registro necessario alla
codifica (inserendo uno o più zeri (0) alla sinistra del numero):
Analogamente coi numeri negativi (inserendo uno o più uni (1) alla sinistra del numero):
Anche qua avremmo dovuto ridefinire il registro, portandolo a 4 bit: