Angelo Gallippi. Fondamenti di informatica



Похожие документы
4 3 4 = 4 x x x 10 0 aaa

I sistemi di numerazione

(71,1), (35,1), (17,1), (8,1), (4,0), (2,0), (1,0), (0,1) 0, = 1, 431 0, = 0, 862 0, = 1, 792 0, = 1, 448 0, = 0, 896

Informatica. Rappresentazione dei numeri Numerazione binaria

SISTEMI DI NUMERAZIONE E CODICI

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Sistema di numerazione binario, operazioni relative e trasformazione da base due a base dieci e viceversa di Luciano Porta

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Logica e codifica binaria dell informazione

PROVA INTRACORSO TRACCIA A Pagina 1 di 6

Architettura degli Elaboratori I Esercitazione 1 - Rappresentazione dei numeri

Sistemi di Numerazione

Lezione 2 OPERAZIONI ARITMETICHE E LOGICHE ARCHITETTURA DI UN ELABORATORE. Lez2 Informatica Sc. Giuridiche Op. aritmetiche/logiche arch.

Informazione analogica e digitale

Codifica binaria dei numeri

Parte 1. Vettori di bit - AA. 2012/13 1.1

Esempi ed esercizi Aritmetica degli elaboratori e algebra di commutazione

CODIFICA BINARIA. ... sono rappresentati ricorrendo a simboli che sintezzano il concetto di numerosità.

La codifica delle informazioni

Richiesta pagina PHP (es: index.php)

Variabili e tipi di dato

Elementi di informatica

SISTEMI DI NUMERAZIONE IL SISTEMA DECIMALE

Introduzione alla programmazione in C

RAPPRESENTAZIONE BINARIA DEI NUMERI. Andrea Bobbio Anno Accademico

Operazioni Aritmetiche e Codici in Binario Giuseppe Talarico 23/01/2013

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Operazioni binarie fondamentali

LICEO SCIENTIFICO "LEONARDO DA VINCI" - RC PROGRAMMA DI INFORMATICA A.S. 2014/15 - CLASSE: I Q - Indirizzo Scienze applicate Prof Miritello Rita

Rappresentazione dei numeri in un calcolatore

Modulo 8. Elettronica Digitale. Contenuti: Obiettivi:

2.12 Esercizi risolti

ESEMPIO 1: eseguire il complemento a 10 di 765

Funzioni in C. Violetta Lonati

Codifica binaria e algebra di Boole

Aritmetica dei Calcolatori 2

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 27 Gennaio 2015

INFORMATICA 1 L. Mezzalira

Sistemi di Numerazione Binaria NB.1

FONDAMENTI di INFORMATICA L. Mezzalira

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Lezione 8. La macchina universale

Elementi di Informatica e Programmazione

Parte II Indice. Operazioni aritmetiche tra valori rappresentati in binario puro. Rappresentazione di numeri con segno

4. Operazioni aritmetiche con i numeri binari

Convertitori numerici in Excel

SISTEMI DI NUMERAZIONE DECIMALE E BINARIO

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Laurea Specialistica in Informatica

ALGEBRA DELLE PROPOSIZIONI

Gestione dei File in C

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

Alessandro Pellegrini

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione in virgola mobile

Obiettivi dell Analisi Numerica. Avviso. Risoluzione numerica di un modello. Analisi Numerica e Calcolo Scientifico

Algebra Booleana 1 ALGEBRA BOOLEANA: VARIABILI E FUNZIONI LOGICHE

2. Codifica dell informazione

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Algebra Di Boole. Definiamo ora che esiste un segnale avente valore opposto di quello assunto dalla variabile X.

Codifica: dal diagramma a blocchi al linguaggio C++

Un ripasso di aritmetica: Rappresentazione binaria - operazioni. riporti

Sommario. Addizione naturale

APPUNTI DI ELETTRONICA DIGITALE

Aritmetica dei Calcolatori 1

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

I SISTEMI DI NUMERAZIONE E LA NUMERAZIONE BINARIA

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

BIT? Cosa c è dietro a questo nome? Che cos è il bit? Perché si usa? Come si converte un numero binario?

Un ripasso di aritmetica: Conversione dalla base 10 alla base 16

LINGUAGGI DI PROGRAMMAZIONE

la scienza della rappresentazione e della elaborazione dell informazione

Fondamenti di Informatica

Allocazione dinamica della memoria - riepilogo

Dispense di Informatica per l ITG Valadier

la scienza della rappresentazione e della elaborazione dell informazione

Esercitazione Informatica I AA Nicola Paoletti

= 1*2^7 + 1*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 210

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Esercizi di programmazione in C

RAPPRESENTAZIONE DEI NUMERI BINARI. Corso di Fondamenti di Informatica AA

Architettura (10/9/2003) Pag. 1/6. Cognome e Nome (in stampatello):

Corso basilare di programmazione

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Origini e caratteristiche dei calcolatori elettronici

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

+ / operatori di confronto (espressioni logiche/predicati) / = > < Pseudo codice. Pseudo codice

Rappresentazione di informazioni con un alfabeto finito

Esercitazioni su rappresentazione dei numeri e aritmetica dei calcolatori"

Calcolatori: Algebra Booleana e Reti Logiche

Elementi di Architettura e Sistemi Operativi

Informatica - A.A. 2010/11

GESTIONE INFORMATICA DEI DATI AZIENDALI

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

LA NOTAZIONE SCIENTIFICA

PIANO DI LAVORO DEI DOCENTI

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Транскрипт:

Angelo Gallippi Fondamenti di informatica

Copyright MMIX ARACNE editrice S.r.l. www.aracneeditrice.it info@aracneeditrice.it via Raffaele Garofalo, 133 A/B 00173 Roma (06) 93781065 ISBN 978 88 548 2506 2 I diritti di traduzione, di memorizzazione elettronica, di riproduzione e di adattamento anche parziale, con qualsiasi mezzo, sono riservati per tutti i Paesi. Non sono assolutamente consentite le fotocopie senza il permesso scritto dell Editore. I edizione: aprile 2009

1 Indice 1 Sistemi di numerazione binari...13 1.1 Codifica binaria pura...13 1.1.1 Conversione da base 10 a base 2 (parte intera)...14 1.1.2 Conversione da base 10 a base 2 (parte decimale)...15 1.1.3 Conversione da base 2 a base 10...16 1.1.4 Operazioni nel sistema binario...16 1.2 Sistema esadecimale...20 1.2.1 Conversione da base 16 a base 10...20 1.2.2 Conversione da base 16 a base 2...21 1.2.3 Conversione da base 10 a base 16...21 1.3 Codifica BCD...22 1.4 Codici binari alfanumerici...22 1.4.1 Codifica ASCII...22 1.4.2 Codifica EBCDIC...24 1.5 Codici rilevatori di errori...26 1.6 Codifica delle grandezze fisiche...28 1.6.1 Digitalizzazione di una forma d onda analogica...28 1.6.2 Digitalizzazione di una immagine...30 1.6.3 Vantaggi della digitalizzazione...32 1.7 Algoritmo di cifratura RSA...33 1.7.1 Costruzione della coppia di chiavi asimmetriche...34 1.7.2 Cifratura e decifrazione...35 2 Algebra di Boole...37 2.1 Operatori AND (&&), OR ( ), NOT (!)...38 2.2 Tabelle di verità...39 2.3 Teoremi di De Morgan...40 2.4 Operatore OR esclusivo XOR (^)...41 2.5 Porte logiche...42 2.6 Transistori MOSFET...44 2.6.1 Produzione dei MOSFET...45 2.7 Circuiti logici AND, OR, NOT, XOR...47 2.8 Sommatore binario...49 2.9 Operatore NOR...51 2.10 Operatore NAND...52

2 Indice 2.11 Circuiti universali (NAND, NOR)... 55 2.12 Operatori logici orientati al bit (bitwise)... 56 2.12.1 AND bit a bit (&)... 56 2.12.2 OR inclusivo bit a bit ( )... 57 2.12.3 OR esclusivo bit a bit (^)... 57 2.12.4 Spostamento a sinistra (<<)... 58 2.12.5 Spostamento a destra (>>)... 58 3 Macchine di Turing... 59 3.1 3.1 Macchina sommatrice... 61 3.2 Macchina copiatrice... 63 4 Architettura di un computer... 67 4.1 Macchina di von Neumann... 67 4.2 Memoria centrale... 68 4.2.1 Memoria di sola lettura (ROM)... 68 4.2.2 Memoria di lettura e scrittura (RAM)... 71 4.3 Unità centrale di elaborazione (CPU)... 75 4.3.1 I registri... 76 4.3.2 Unità di controllo... 78 4.3.3 Unità di calcolo... 79 4.3.4 Memoria cache... 83 4.3.5 Pipeline... 84 4.4 Stack... 85 4.4.1 Puntatore di stack... 86 4.5 Bus del microprocessore... 87 4.5.1 Bus dati... 88 4.5.2 Bus indirizzi... 88 4.5.3 Bus di controllo... 89 4.5.4 Bus di espansione... 89 5 Algoritmi di base... 91 5.1 Diagrammi di flusso... 92 5.2 Controllo del programma... 94 5.2.1 Selezione binaria... 95 5.2.2 Selezione multipla... 97 5.3 Iterazione... 100 5.3.1 Divisione con sottrazioni ripetute... 100 5.3.2 Moltiplicazione con addizioni ripetute... 101

Indice 3 5.4 Strutturazione degli algoritmi...102 5.4.1 Struttogrammi...104 5.5 Iterazione enumerativa (for)...106 5.5.1 Somma dei primi n numeri naturali...108 5.6 Iterazione con guardia all inizio (while)...109 5.6.1 Massimo Comun Divisore...109 5.6.2 Numero massimo...110 5.7 Calcolo del fattoriale (1)...112 5.8 Iterazione con guardia alla fine (do-while)...113 5.8.1 Moltiplicazione tramite addizioni ripetute...113 5.8.2 Calcolo della radice quadrata...114 5.9 Cicli nidificati...116 5.10 Confronto tra do-while e while...117 5.11 Iterazione e ricorsività...119 5.11.1 Definizione ricorsiva di fattoriale...120 5.11.2 Definizione ricorsiva di potenza...121 5.11.3 Serie di Fibonacci...121 5.11.4 Alberi binari...122 6 Traduzione del programma...127 6.1 Programma compilatore...128 6.1.1 Fase di analisi...129 6.1.2 Fase di sintesi...132 6.2 Programma assemblatore...132 6.3 Programma legatore...133 6.4 Programma caricatore...134 6.5 Compilatore DMC...135 7 Tipi dati...137 7.1 Tipi dati semplici...138 7.1.1 Valori integer...139 7.1.2 Numeri floating point e double precision...139 7.1.3 Tipo character...140 7.2 Determinazione della occupazione di memoria (sizeof()) 140 7.3 Operatori aritmetici...141 7.3.1 Divisione intera (operatore modulo %)...141 7.3.2 Operatore unario (negazione)...141

4 Indice 7.3.3 Associatività e precedenza degli operatori... 142 7.4 Espressioni e operatori relazionali... 143 7.5 Operatori logici... 145 8 La modularità... 147 8.1 Funzioni... 147 8.2 La funzione main()... 148 8.3 La funzione printf()... 150 8.3.1 Sequenza di escape \n... 151 8.4 Commenti... 153 8.5 Sequenze di controllo di conversione... 153 8.5.1 Sequenza %d (interi)... 153 8.5.2 Sequenza %ld (interi lunghi)... 154 8.5.3 Sequenza &u (interi senza segno)... 155 8.5.4 Sequenza %f (numeri in virgola mobile)... 156 8.5.5 Sequenza %e (notazione esponenziale)... 157 8.5.6 Sequenza %c (caratteri)... 158 8.5.7 Sequenza %s (stringhe)... 158 8.6 Specificatori di larghezza di campo... 158 8.6.1 Numeri interi (%d)... 158 8.6.2 Numeri in virgola mobile (%f)... 160 8.7 Modificatori di formato... 160 8.7.1 Giustificazione a sinistra (%-)... 160 8.7.2 Visualizzazione del segno + (%+)... 161 8.8 Variabili e dichiarazioni... 161 8.9 Istruzioni di assegnazione... 162 8.10 Istruzioni di dichiarazione (int, float, double, char)163 8.11 Istruzioni di dichiarazione/definizione... 164 8.12 Operatore di assegnazione (=)... 165 8.12.1 Valore di una espressione di assegnazione... 165 8.12.2 Assegnazioni multiple... 166 8.12.3 Operatori di assegnazione (+=, -=, *=, /=, %=)... 166 8.12.4 Operatori di incremento e di decremento (++, --)... 167 8.13 Indirizzi delle variabili... 168 8.14 Operatore di indirizzo &... 169 8.14.1 Sequenza di controllo di conversione %p... 169 8.15 Variabili puntatori... 170

Indice 5 8.15.1 Operatore di indirezione *...171 8.15.2 Dichiarazione dei puntatori...172 8.16 Codice ASCII di un carattere (%o, %x)...174 8.17 Ingresso interattivo (scanf())...176 8.17.1 Spazi nella stringa di controllo (%lf)...178 8.18 Costanti simboliche (#define)...178 9 Controllo del flusso...181 9.1 Istruzione if-else...181 9.1.1 Istruzioni composte...182 9.1.2 Istruzione if a una via...183 9.1.3 Istruzioni if nidificate...184 9.1.4 Catena if-else...184 9.2 Istruzione switch...185 10 Cicli...187 10.1 Istruzione while...187 10.1.1 scanf() all interno di un ciclo while...189 10.1.2 Sentinelle (EOF)...189 10.1.3 Istruzioni break e continue...191 10.1.4 Istruzione null (;)...192 10.2 Istruzione for...193 10.2.1 scanf() all interno di un ciclo for...195 10.3 Istruzione do-while...196 10.3.1 Controlli di validità...197 11 Tipi dati strutturati...199 11.1 Vettori (a una dimensione)...199 11.1.1 Ingresso dei valori...201 11.1.2 Visualizzazione dei valori...203 11.1.3 Componente massima...204 11.1.4 Da vettore a istogramma...205 11.2 Vettori a due dimensioni (matrici)...206 11.2.1 Inizializzazione...207 11.2.2 Visualizzazione...207 11.2.3 Moltiplicazione per uno scalare...208 11.2.4 Tavola pitagorica...208 11.2.5 Triangolo di Tartaglia...209 11.3 Vettori a più di due dimensioni...212

6 Indice 12 Tipi dati definiti dall'utente... 213 12.1 Istruzione didichiarazione typedef... 213 12.2 Specificatore enum... 213 12.3 Strutture (singole)... 214 12.3.1 Dichiarazione... 215 12.3.2 Assegnazione (operatore.)... 216 12.3.3 Nomi tag... 217 12.3.4 Inizializzazione... 218 12.3.5 Vettori di strutture... 220 12.4 Liste concatenate di strutture... 222 12.4.1 Puntatori speciali... 225 12.4.2 Puntatore di struttura (->)... 227 12.5 Unioni... 230 12.5.1 Nomi tag... 232 12.5.2 Operazioni... 233 13 Funzioni di biblioteca... 235 13.1 Funzioni matematiche (file <math.h>)... 235 13.2 Funzioni di ingresso e uscita (file <stdio.h>)... 238 13.2.1 Funzione getchar()... 239 13.2.2 Funzione putchar()... 239 13.2.3 Funzioni gets(), puts()... 240 13.2.4 Equivalenza tra puts() e printf()... 240 13.2.5 Non equivalenza tra gets() e scanf()... 241 13.3 Funzioni di stringa (file <string.h>)... 242 13.4 Funzioni di conversione di tipi dati (file <stdlib.h>).. 242 13.5 Generazione di numeri pseudo-casuali (rand())... 244 13.5.1 Programma 20 lanci... 244 13.5.2 Programma 6000 lanci... 245 13.5.3 Funzione srand()... 246 13.5.4 File <time.h>... 247 13.6 Funzioni di carattere (file <ctype.h>)... 249 14 Funzioni definite dall utente... 251 14.1 Dichiarazione (prototipo) di funzione... 252 14.2 Chiamata... 252 14.3 Definizione... 254 14.3.1 Linea d intestazione... 254

Indice 7 14.3.2 Corpo...255 14.4 Conversione Fahrenheit-Celsius...257 14.5 Fattoriale ricorsivo...257 14.6 Serie di Fibonacci. Calcolo ricorsivo...258 14.7 Serie di Fibonacci. Calcolo iterativo...259 14.8 Passaggio di vettori (1)...260 14.8.1 Componente massima...261 14.9 Passaggio di vettori (2)...262 15 Ambito e durata delle variabili...263 15.1 Variabili locali e globali...263 15.1.1 Uso delle variabili globali...265 15.1.2 Classe extern...266 15.2 Durata delle variabili (classi di memorizzazione)...268 15.2.1 Classe auto...269 15.2.2 Classe register...270 15.2.3 Classe static...270 15.3 Allocazione dinamica di memoria (malloc(), free())273 15.4 Passaggio di una matrice...275 15.5 Chiamate per valore e per riferimento...277 15.5.1 Passaggio, memorizzazione e uso degli indirizzi...277 15.5.2 Confronto tra chiamata per valore e per riferimento.279 15.5.3 Popolamento e visualizzazione di una lista concatenata 281 16 Algoritmi di ricerca...283 16.1 Ricerca lineare...283 16.2 Ricerca binaria...285 16.2.1 Tempo di esecuzione...289 16.3 Notazione O-grande...290 17 Vettori, indirizzi e puntatori...291 17.1 Puntatori come nomi di vettori...291 17.2 Notazione con puntatore e offset...292 17.3 Costanti puntatore...294 17.4 Aritmetica dei puntatori...295 18 Algoritmi di ordinamento...299 18.1 Ordinamento a bolle (Bubble sort)...300 18.1.1 Miglioramenti...304 18.1.2 Bolle per riferimento...307

8 Indice 18.2 Ordinamento per selezione... 310 18.3 Ordinamento per inserimento... 313 18.4 Shell sort... 317 18.5 Heap sort... 319 18.6 Ordinamento per fusione (Merge sort)... 326 18.6.1 Suddivisione... 326 18.6.2 Ordinamento... 327 18.6.3 Fusione... 327 18.7 Quicksort... 330 18.7.1 Efficienza... 333 19 Manipolazione di stringhe di caratteri... 335 19.1 Copia carattere per carattere... 335 19.2 Immissione carattere per carattere... 336 19.3 Funzione scritta dall utente... 337 19.4 Puntatori e funzioni di biblioteca... 338 20 File di dati... 343 20.1 Dichiarazione (FILE)... 343 20.1.1 Apertura (fopen())... 345 20.2 Funzioni di scrittura (fputc(), fputs(), fprintf()) 346 20.2.1 Chiusura (fclose())... 347 20.2.2 Scrittura da programma... 347 20.3 Apertura per lettura (fopen())... 348 20.4 Funzioni di lettura (fgetc(), fgets(), fscanf())... 350 20.4.1 Uso di fgetc()... 351 20.4.2 Lettura con fscanf()... 352 20.4.3 Lettura con fgets()... 353 20.5 File standard di dispositivo (stdin, stdout)... 354 20.6 Puntatore di file (stderr)... 355 20.7 Confronto tra fgets()/gets() e puts()/fputs()... 355 20.8 Scrittura di un file da tastiera (feof())... 356 20.8.1 Lettura del file immesso da tastiera... 357 20.8.2 File offset... 358 20.9 Funzione rewind()... 358 20.10 Funzione fseek()... 359 20.11 Funzione ftell()... 360 20.12 File ad accesso casuale... 362

Indice 9 20.12.1 Funzioni fwrite() e fread()...362 20.12.2 Creazione...364 20.12.3 Scrittura...365 20.12.4 Lettura...366 21 Argomenti dalla linea dei comandi...369 21.1 Passaggio di argomenti...369 21.2 Copia di un file...371 21.3 Reindirizzamento di input e output (operatore >)...373 21.4 Aggiunta di input e output (operatore >>)...373 22 Risposte agli esercizi...375 Testi consigliati Aho, Alfred V. and Jeffrey D. Ullman [1983]. Data Structures and Algorithms. Addison-Wesley, Reading, Massachusetts. Cormen, Thomas H. [2001]. Introduction to Algorithms. McGraw- Hill, New York. Knuth, Donald E. [1998]. The Art of Computer Programming, Volume 3, Sorting and Searching. Addison-Wesley, Reading, Massachusetts. Pearson, Peter K. [1990]. Fast Hashing of Variable-Length Text Strings. Communications of the ACM, 33(6):677-680, June 1990. Pugh, William [1990]. Skip Lists: A Probabilistic Alternative to Balanced Trees. Communications of the ACM, 33(6):668-676, June 1990. Deitel, H.M. C Corso completo di programmazione, Apogeo, Milano, 2004. Dennis M. Ritchie, "The Development of the C Language, in: http://cm.bell-labs.com/cm/cs/who/dmr/chist.html Gallippi, A. Dizionario di informatica Inglese/Italiano, Tecniche Nuove, Milano, 2006.

10 Test d'ingresso 1. Cosa indicano le seguenti sigle: NMOS, NAND, DRAM, CD- ROM? 2. Come si chiama il fisico che ha realizzato il primo microprocessore? 3. Come si chiama il fisico, premio Nobel, che ha inventato il circuito integrato? 4. Cos è una memoria cache? 5. Cosa si misura in Megahertz? E in Megabyte? 6. Qual è il risultato della seguente operazione: 9 modulo 4? 7. Cosa indica la parola inglese file? 8. Quali sono i primi cinque termini della successione di Fibonacci? 9. A cosa può servire il triangolo di Tartaglia? 10. Quanto valgono le seguenti espressioni: 2-3 ; 0,5 4 ; 16 1/2? 11. Qual è stato lo strumento di calcolo più diffuso prima dell'avvento delle calcolatrici elettroniche? 12. A cosa possono servire i numeri primi?

1 Sistemi di numerazione binari Il sistema di numerazione binario, ideato dal filosofo tedesco Gottfried Wilhelm Leibniz 1, consente di rappresentare un qualsiasi numero usando i due soli simboli o cifre 0 e 1, e di compiere con essi tutte le usuali operazioni aritmetiche. Le stesse cifre 0 e 1 consentono di codificare anche dati testuali o alfabetici e, attraverso il processo di digitalizzazione, una qualsiasi grandezza analogica, cioè variabile in maniera continua. Le cifre 0 e 1 - o, più in generale, i termini antitetici vero-falso, sì-no e simili - possono essere rappresentate dagli stati fisici ( acceso-spento, aperto-chiuso, conduttore-isolante, ecc.) di dispositivi quali lampadine, interruttori e transistori, e ciò determina la grande versatilità dei moderni computer. 1.1 Codifica binaria pura La rappresentazione di un numero tramite le sole cifre 0 e 1 può avvenire secondo diversi criteri; la codifica binaria pura (detta semplicemente binaria ) ha il vantaggio di rappresentare i numeri in modo che si possano applicare a essi le stesse regole dell aritmetica decimale. Negli altri tipi di notazione binaria, invece, i risultati della conversione non possono essere impiegati in operazioni aritmetiche, perché non fornirebbero i risultati corretti. Il sistema binario è, come quello decimale, di tipo posizionale, in quanto la posizione di una cifra in un numero determina il valore o peso di quella cifra. Ciò a differenza, per esempio, del sistema di numerazione degli antichi romani, che era solo parzialmente posizionale (consideriamo, ad esempio, il numero MDCCXIV). Per esempio, nei numeri 300 e 3000 la stessa cifra 3 indica quantità diverse, in quanto nel primo va pensata moltiplicata per 100, nel secondo per 1000 (come si avverte anche 1 Leibniz espose il suo sistema in diversi scritti, tra i quali De progressione dyadica che porta la data del 15 marzo 1679, una lettera a Claudio Filippo Grimaldi del gennaio/febbraio 1697 e una al padre gesuita Joachim Bouvet del 18 maggio 1703. In quest ultima, in particolare, Leibniz scrive: «Erano ben più di venti anni che avevo in testa questa aritmetica fondata sullo 0 e sull 1, della quale vedevo le mirabili conseguenze per condurre la scienza dei numeri a una perfezione che supera tutto quello che possediamo».

... 10 3 =1000 10 2 =100 10 1 =10 10 0 =1, 14 Capitolo I leggendo i due numeri). Ciò si esprime dicendo che le cifre prima della virgola di un numero decimale vengono moltiplicate per le successive potenze con esponente positivo del numero 10 (detto base del sistema di numerazione), che sono: Invece le cifre dopo la virgola di un numero in base 10 vengono moltiplicate per le successive potenze con esponente negativo del numero 10, che sono:, 10-1 =0,1 10-2 =0,01 10-3 =0,001 10-4 =0,0001... Anche nel sistema binario le cifre di un numero vanno pensate moltiplicate per una opportuna potenza, in questo caso della base 2. Per quanto riguarda la parte prima della virgola di un numero in base 2, tali potenze sono:... 2 5 =32 2 4 =16 2 3 =8 2 2 =4 2 1 =2 2 0 =1 Per quanto riguarda la parte dopo la virgola di un numero in base 2, le successive potenze del 2 sono:, 2-1 =0,5 2-2 =0,25 2-3 =0,125 2-4 =0,0625... 1.1.1 Conversione da base 10 a base 2 (parte intera) Per convertire la parte intera di un numero da base 10 a base 2 si può seguire il seguente algoritmo delle divisioni successive: si divide il numero per 2 annotando il quoziente e il resto; si ripete l operazione fino a ottenere per quoziente 0; la successione dei resti ottenuti, scritti dall ultimo al primo, fornisce la conversione desiderata. Ecco come si effettua, ad es., la conversione in binario di 37 10 :,

Sistemi di numerazione binari 15 Quindi: 37 10 100101 2. 1.1.2 Conversione da base 10 a base 2 (parte decimale) Per convertire la parte decimale di un numero da base 10 a base 2 si può usare l'algoritmo delle moltiplicazioni successive: si moltiplica il numero per 2, annotando la prima cifra del prodotto se essa vale 1, altrimenti annotando 0; si ripete la moltiplicazione del risultato ottenuto, terminando il procedimento quando si ottiene come prodotto una potenza del 10; la successione degli 0 e 1 ottenuti, scritti a partire dal primo, fornisce la conversione desiderata. Nel caso, ad esempio, del numero 0,8125 10, la conversione si effettua secondo lo schema seguente: 1 a moltiplicazione 8125 * 2 = 1 6250 1 prodotto 6250 * 2 = 1 2500 2500 * 2 = 0 5000 5000 * 2 = 1 0000 Quindi: 0,8125 10 0,1101 2. Esercizio 1. Convertire il numero 0,3 10 in base 2. Come si vede, nel convertire la parte dopo la virgola di un numero da base 10 a base 2 può succedere che il numero, non periodico nel primo sistema di numerazione, diventi periodico nel secondo. Questo fatto può comportare una perdita di esattezza quando si eseguano operazioni tra numeri con la virgola che siano stati convertiti nel sistema binario.

16 Capitolo I 1.1.3 Conversione da base 2 a base 10 Per convertire un numero da base 2 a base 10 si segue il seguente algoritmo: si moltiplica ogni bit del numero per il valore dalla corrispondente potenza del 2, quindi si sommano i valori così ottenuti. Nel caso, ad es., del numero 101101 2 la conversione si effettuerebbe secondo lo schema seguente: Quindi: 100101 2 37 10. Osserviamo che tale procedimento si applica sia alla parte intera sia a quella decimale del numero. Quindi nel caso, ad es., del numero 0,1101 2 la conversione si effettua secondo lo schema seguente: 1.1.4 Operazioni nel sistema binario Le operazioni sui numeri binari si eseguono secondo le regole ordinarie dell aritmetica, con l ulteriore semplificazione derivante dal fatto di operare su due sole cifre.

Sistemi di numerazione binari 17 La somma si esegue allineando i numeri sulla destra e applicando alle cifre sulla stessa verticale le regole della somma binaria riportate in Tabella 1. Tabella 1. Regole della somma binaria. + 0 1 0 0 0 1 0 1 Per esprimere in modo più uniforme i quattro risultati indicati in Tabella 1, conviene ragionare in termini di: due addendi / un risultato e un riporto, come indicato in Tabella 2. Tabella 2. Risultati e riporti della somma binaria di due cifre. Addendi Risultato Riporto 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 Tuttavia, dato che in pratica si sommano numeri costituiti da più di una cifra binaria, conviene ragionare in termini di due addendi e un riporto / un risultato e un riporto, come indicato in Tabella 3. Tabella 3. Risultati e riporti della somma binaria di più cifre. Addendi Riporto preced. Risultato Riporto attuale 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 Ad es., la somma di 10110 e 11111 si esegue secondo lo schema seguente:

18 Capitolo I Anche la moltiplicazione tra due numeri si esegue come nel sistema decimale. In particolare si applicano ai prodotti parziali delle singole cifre le regole di Tabella 4, quindi si sommano i prodotti parziali con le regole della somma viste in precedenza. Tabella 4. Regole della moltiplicazione binaria. * 0 1 0 0 0 1 0 1 Osserviamo che la Tabella 4 è un sottoinsieme della familiare tavola pitagorica (scritta, di solito, senza la riga e la colonna dello 0). La sottrazione nel sistema binario si potrebbe eseguire come nel sistema decimale ma di fatto, per evitare la situazione di dovere prendere in prestito una unità dalla cifra di sinistra quando una cifra del sottraendo superi quella corrispondente del minuendo, conviene eseguire la sottrazione tramite due operazioni più semplici per i circuiti binari: la complementazione e l addizione. Ricordiamo che nel sistema decimale il complemento a 9 di un numero è quel numero che sommato al primo dà un risultato costituito da tutte cifre 9. Quindi il complemento di un numero di due cifre si ottiene sottraendo il numero da 99, di uno a tre cifre sottraendo il numero da 999 e così via. Ad es., il complemento di 13 è (99-13) = 86. L uso del complemento evita di eseguire una sottrazione, sostituendola con un addizione. Infatti, ad es., nell identità: 13 9 = 4 si può sottrarre 99 a entrambi i membri, ottenendo: 13 9 99 = 4 99 e, cambiando segno a entrambi i membri, (99 13) + 9 = (99 4)

Sistemi di numerazione binari 19 Dato che la parentesi a primo membro rappresenta il complemento del minuendo e quella a secondo membro il complemento del sottraendo, se ne trae la seguente regola. Per eseguire una sottrazione si può eseguire il complemento a 9 del minuendo, sommargli il sottraendo ed eseguire il complemento a 9 della somma ottenuta. La regola precedente vale ovviamente anche nel sistema binario - dove anzi risulta di applicazione ancora più semplice - sostituendo il complemento a 9 con il complemento a 1. Si definisce complemento a 1 di un numero quel numero che sommato al primo dà un risultato costituito da tutte cifre 1. Ad es. il complemento a 1 di 1101 è 0010 2 2, dato che 1101 2 + 0010 2 = ------- 1111 2 Si vede che: il complemento a 1 di un numero si ottiene cambiando i suoi 0 in 1 e viceversa. Applichiamo allora questa regola alla sottrazione 13 9: Tuttavia, nel sistema decimale si considera anche il complemento a 10 di un numero, definito come il numero che sommato al primo dà tutte cifre 0 (trascurando la cifra di riporto più a sinistra). Analogamente, nel sistema binario si considera il complemento a 2 di un numero, definito come il numero che sommato al primo dà tutte cifre 0 (trascurando il bit di riporto più a sinistra). Ad es., il complemento a 2 di 1101 è 0011, dato che: 1101 + 0011 = -------- 1 0000

20 Capitolo I Si vede che il complemento a 2 di un numero si ottiene sommando 1 al suo complemento a 1. Usando il complemento a 2, la regola per la sottrazione diventa: si somma al minuendo il complemento a 2 del sottraendo, quindi si sopprime la cifra più a sinistra della somma ottenuta. Applichiamo questa regola alla solita sottrazione 13 9: 13-1101 - 1101 + 9 = 1001 = 0111 = complem. a 2 --------- 1 0100 1.2 Sistema esadecimale Molto usato in informatica è il sistema di numerazione esadecimale, che impiega i 16 simboli: 0 1 2 3 4 5 6 7 8 9 A B C D E F Le lettere A-F vanno considerate cifre, di valori rispettivamente: A = 10 B = 11 C = 12 D = 13 E = 14 F = 15 Anche il sistema esadecimale è di tipo posizionale, in quanto le cifre di un numero vanno pensate moltiplicate per una opportuna potenza, in questo caso della base 16. Per quanto riguarda la parte prima della virgola di un numero esadecimale (la sola di effettivo utilizzo), tali potenze sono:... 16 4 =65.536 16 3 =4.096 16 2 =256 16 1 =16 16 0 =1 1.2.1 Conversione da base 16 a base 10 Per convertire un numero da base 16 a base 10 si può usare il metodo indicato nello schema seguente:

Sistemi di numerazione binari 21 Se usiamo la notazione del linguaggio C, nel quale i numeri esadecimali iniziano con le cifre 0x, vale quindi la seguente conversione: 0x2A7F 10.879 10 1.2.2 Conversione da base 16 a base 2 Per convertire un numero esadecimale in binario si convertono successivamente le sue cifre tramite gruppi di quattro bit, secondo la corrispondenza di Tabella 5. Lo stesso criterio vale ovviamente per il passaggio inverso binario esadecimale, con l avvertenza di iniziare la sostituzione partendo dal gruppo di quattro bit meno significativi (quelli più a destra). Tabella 5. Conversione esadecimale binario. Esadecimale Binario Esadecimale Binario 0 0000 8 1000 1 0001 9 1001 2 0010 A 1010 3 0011 B 1011 4 0100 C 1100 5 0101 D 1101 6 0110 E 1110 7 0111 F 1111 1.2.3 Conversione da base 10 a base 16 Per questa conversione conviene passare attraverso la base 2, secondo le regole viste. Quindi, ad es.: 37 10 0010 0101 2 0x25.