Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Elementi di informatica e programmazione., Appunti di Elementi di Informatica

Appunti dell'insegnamento di "Elementi di informatica e programmazione" del professore Alessandro Saetti. Includono tutti gli argomenti necessari a superare l'esame (NB. Non sono inclusi appunti riguardanti la parte di programmazione in C) sistemati, corretti, comprensibili ed esaustivi. Riepilogo degli argomenti: o Problemi e le loro soluzioni o Algoritmi e proprietà o Schemi a blocchi o La codifica dell'informazione o L'architettura del calcolatore - La macchina di Von Neumann - La struttura del processore (CPU) - Ciclo Macchina e il linguaggio macchina (vari tipi di istruzioni con esempi) - Periodo di Clock - Assembly - La memoria (gerarchia e spiegazioni dettagliate) - Interfacce di ingresso e di uscita - Tipologie di indirizzamento e sincronizzazione - Le periferiche fondamentali

Tipologia: Appunti

2021/2022

In vendita dal 08/10/2023

EmanueleIng
EmanueleIng 🇮🇹

2 documenti

1 / 40

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Ingegneria Informatica Elementi di informatica e programmazione - Saetti Alessandro 2022/2023
ELEMENTI DI INFORMATICA E PROGRAMMAZIONE
Introduzione
Cosa si intende per programmazione? La creazione di procedure per risolvere problemi. Si interagisce con
una macchina che risolverà questi problemi. Per questo, bisogna trovare il procedimento, delle fasi, quali:
- Sviluppo
- Identificazione
- Progetto (definizione e architettura del software)
- Implementazione (codifica)
- Collaudo
- Manutenzione
Oggigiorno la programmazione è importante, in quanto siamo nella quarta rivoluzione industriale:
1. Meccanica
2. Elettronica
3. Microelettronica
4. Informatica (big data, artificial intelligence, internet of things...)
Cè il secondo linguaggio di programmazione più diffuso al mondo, sotto Python e a seguire Java. Cha
circa cinquant'anni, venne inventato negli anni Settanta del Novecento (1972), agli inizi dell’informatica.
Questo linguaggio ha molti pregi:
Efficacia: utile per operazioni veloci come i Kernel e per scrivere programmi efficienti che girano
utilizzando poche risorse (come la memoria);
Portabilità: funziona su molteplici piattaforme e per ogni piattaforma esistono compilatori C per
cui un programma in C può essere portato da una piattaforma all’altra con poco sforzo, anche
grazie a questo il linguaggio C si diffonde più facilmente;
Potenza: con poche istruzioni si può fare tanto;
Semplicità: è un linguaggio piccolo poche parole chiave e istruzioni (come l'inglese, poche
parole per più significati);
Flessibilità: il programmatore ha molte libertà e si può utilizzare per applicazioni di varia natura
Tuttavia, vi sono anche dei difetti:
Incline agli errori: piccoli errori possono compromette l'intero programma (es. una parola nel
punto sbagliato comporta un crash del programma);
Difficile da modificare.
I Problemi e la loro Soluzione
L'uomo aveva l'ambizione di creare una macchina che risolvesse per lui i problemi, che possono essere visti
come una classe di domande omogenee a cui rispondere con una procedura uniforme. Troviamo vari
elementi all’interno di un Problema:
LIstanza è la domanda;
La Soluzione dell’istanza;
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28

Anteprima parziale del testo

Scarica Elementi di informatica e programmazione. e più Appunti in PDF di Elementi di Informatica solo su Docsity!

ELEMENTI DI INFORMATICA E PROGRAMMAZIONE

Introduzione

Cosa si intende per programmazione? La creazione di procedure per risolvere problemi. Si interagisce con una macchina che risolverà questi problemi. Per questo, bisogna trovare il procedimento, delle fasi, quali:

  • Sviluppo
  • Identificazione
  • Progetto (definizione e architettura del software)
  • Implementazione (codifica)
  • Collaudo
  • Manutenzione Oggigiorno la programmazione è importante, in quanto siamo nella quarta rivoluzione industriale:
  1. Meccanica
  2. Elettronica
  3. Microelettronica
  4. Informatica (big data, artificial intelligence, internet of things...) C è il secondo linguaggio di programmazione più diffuso al mondo, sotto Python e a seguire Java. C ha circa cinquant'anni, venne inventato negli anni Settanta del Novecento (1972), agli inizi dell’informatica. Questo linguaggio ha molti pregi : ● Efficacia : utile per operazioni veloci come i Kernel e per scrivere programmi efficienti che girano utilizzando poche risorse (come la memoria); ● Portabilità: funziona su molteplici piattaforme e per ogni piattaforma esistono compilatori C per cui un programma in C può essere portato da una piattaforma all’altra con poco sforzo, anche grazie a questo il linguaggio C si diffonde più facilmente; ● Potenza : con poche istruzioni si può fare tanto; ● Semplicità : è un linguaggio piccolo → poche parole chiave e istruzioni (come l'inglese, poche parole per più significati); ● Flessibilità : il programmatore ha molte libertà e si può utilizzare per applicazioni di varia natura Tuttavia, vi sono anche dei difetti : ● Incline agli errori : piccoli errori possono compromette l'intero programma (es. una parola nel punto sbagliato comporta un crash del programma); ● Difficile da modificare.

I Problemi e la loro Soluzione

L'uomo aveva l'ambizione di creare una macchina che risolvesse per lui i problemi, che possono essere visti come una classe di domande omogenee a cui rispondere con una procedura uniforme. Troviamo vari elementi all’interno di un Problema: ● L’ Istanza è la domanda; ● La Soluzione dell’istanza ;

● Le variabili d'ingresso : descrivono il caso in esame (il problema da risolvere) → dati (valori assunti); ● Le variabili d'uscita : rappresentano la soluzione del problema → risultati (valori assunti). ● Elaborazione : avviene quando si manipolano i dati in ingresso per ottenere le variabili d'uscita P 1 : Quanto vale la radice quadrata intera Y di un numero intero positivo X? P 2 : Quanto vale la radice N-esima intera Y di un numero intero positivo X? P 3 : Quanto vale la radice quadrata intera Y di un numero positivo X? Abbiamo delle differenze sostanziali: Il problema P 2 include più variabili di P 1 (N, X, Y) mentre il problema P 3 ha le stesse variabili di P 3 ma ha un dominio più esteso (dom(P 1 ) → tutti i numeri ℤ, dom(P 3 ) → tutti i numeri ℝ).

Risoluzione di un Problema

La soluzione P 3 non è un numero, ma un procedimento. II problema può essere risolto in cinque fasi, che sono:

  1. Identificazione : parte dalle esigenze del cliente (ingegneria del software)
  2. Analisi : trovare la soluzione
  3. Descrizione : esprimere in termini chiari per ii soggetto 2 (linguaggio formale = linguaggio di programmazione)
  4. Interpretazione descrizione
  5. Attuazione soluzione

Problema : Quanto vale il quadrato Z di un intero positivo Y? Algoritmo :

  1. Assegna a Z il valore 0
  2. Assegna a X il valore 1
  3. Se X ≤ Y allora vai a passo 4; altrimenti vai al passo 7
  4. incrementa Z di Y unità
  5. incrementa X di 1 unità
  6. Vai al passo 3
  7. Fine Supponiamo che Y sia 3, allora Z=0 e X=1; la disequazione del passo 3 e verificata → Z=3 e X=2; si torna al passo 3 dove la disequazione è verificata → Z = 6 e X = 3; torno al passo 3 e ho ancora la disequazione valida, quindi X=4 e Z=9; quindi si arriva al punto in cui la disequazione al passo tre non è più verificata e si arriva al passo 7. Si ha per soluzione che il quadrato di Y(3) è Z(9).

Il Calcolatore come esecutore

II calcolatore è un esecutore universale di algoritmi e possiede alcune qualità superiori al calcolatore umano: ● Velocità : essenziale per ottenere risultati in tempi brevi (es. regolatore del reattore nucleare); ● Affidabilità : seppur l'uomo bravo, può anche sbagliare, quindi i risultati ottenuti non sono corretti; ● Costo : i costi dell'operatore umano tendono a salire, quello dei calcolatori a scendere. Affinché i programmi siano precisi, bisogna usare precisi elementi linguistici dell’esecutore: ● Il linguaggio che è in grado di interpretare. Ha una caratterizzazione sintattica , cioè definisce le regole di scrittura, ciò che la macchina comprende, quindi il linguaggio che l’esecutore è in grado di interpretare deve essere definito in modo completo e non ambiguo ; ● L'insieme delle azioni che è in grado di compiere. Ha una caratterizzazione pragmatica , cioè l’insieme delle azioni che l’esecutore è in grado di compiere deve essere definito e finito , e tali azioni devono essere elementari per l’esecutore; ● L'insieme delle regole che a ogni frase del linguaggio associano le relative azioni da compiere. Ha una caratterizzazione semantica , cioè definisce le regole di significato, quindi l’insieme delle

regole di associazione tra costrutti del linguaggio e azioni deve essere definito in modo completo e non ambiguo. Si può inoltre andare incontro a degli errori che possono essere di vario tipo: ● errori funzionali : se gli errori avvengono nella prima fase di identificazione, si sbaglia ad identificare il problema e questi sono difficili da risolvere; ● errori logici :

  • primari → errore nella fase di analisi e cioè nella formulazione dell’algoritmo, che non risolve il problema e quindi si ha un’errata soluzione;
  • secondari → quando il programma non risolve il problema (algoritmo e soluzione non coincidono), in quanto si ha un errore nella fase di descrizione dell’algoritmo del programma. Si hanno anche s errori nell’uso scorretto del linguaggio: ● errori sintattici :, quindi si ha sbagliato a scrivere la forma del programma:
  • forma dei singoli termini (parole chiave, stringhe, variabili,... ) Es.: flot f = 12,43; → float f = 12,
  • regole di composizione delle espressioni (operatori-operandi, ...) Es.: int i; i = ”prova.txt” → int i; i = 5; queste vengono direttamente identificate dal calcolatore che lo segnala ● errori semantici : si ha sbagliato a scrivere il significato del programma:
  • operazioni con risultato indeterminato Es.: int i, j; i = 0; j = 2 / i;
  • operazioni con risultato diverso da quello desiderato Es.: if (i = 1) printf(”i è unitario”) → if (i == 1) printf(”i è unitario”); scoperti attraverso l’ ispezione del codice da parte del programma oppure facendo testing , quindi testando il programma con differenti input (disciplina del testing). Più l’errore è agli inizi e più costa correggerlo. Per quanto riguarda gli errori si ha una differenza sostanziale tra i due operatori → l’affidabilità. La macchina ha una percentuale molto bassa di errori che quasi sempre sono del primo operatore (la persona).

Computazione: definizioni

Quando si esegue un programma di parla di : ● Computazione : esecuzione di un algoritmo in corrispondenza di certi dati iniziali; ● Passo di computazione : ogni singolo passo elementare che l’esecutore compie durante una computazione; ● Processo : sequenza di passi elementari che l’esecutore compie in corrispondenza di certi dati iniziali durante l'esecuzione di un algoritmo; ● Flusso di esecuzione : ordine di esecuzione delle istruzioni. Algoritmo = concetto statico Processo = concetto dinamico → matura nel corso dell’esecuzione. Un processo può essere costituito da

Variabili

Caratteristiche delle variabili: ● Hanno un nome per identificare univocamente la variabile ● Sono tipizzate , cioè è specificato un tipo di dato che possono contenere ● Hanno una locazione di memoria per conservare il dato che la variabile memorizza ● Gli può essere assegnato un solo valore ● Possono comparire in istruzioni di assegnamento ed espressioni Classificate in base a:

  • visibilità da parte dell’utente : visibili o invisibili;
  • variabilità : costanti o varibaili;
  • struttura : elementari o strutturate;
  • origine : definite/nuove (dal programmatore) o predefinite/originarie (dal linguaggio di programmazione);
  • visibilità nel codice : globale (visibile nell’intero codice/programma) o locale (visibile solo in una porzione del codice)
  • visibilità nel flusso di esecuzione : statica (sempre presenti per tutto il processo) o dinamica (solo in una porzione del processo) Prima di poter usare il valore di una variabile è necessario assegnarlo (→ istruzione di assegnamento)

Istruzioni

Le istruzioni possono essere di: assegnamento , elaborazione, controllo, ingresso o uscita, controllo del flusso di esecuzione Istruzioni di Assegnamento Sono usate per assegnare un valore, usualmente quello di un’espressione, ad una variabile o ad un elemento di vettore. Possono anche essere utilizzate per modificare i contenuti di locazione di memoria assoluta. La variabile può apparire nelle istruzioni o nell’espressione. Sono indicate con “ x← ” dove x è la variabile ( left value ) e alla destra della freccia vi è una costante/variabile/espressione ( right value ). ID ← costante variabile espressione x ← 0 y y + 1

Esistono tre tipi di espressioni: ● espressioni aritmetiche , formate da:

  • Operandi : variabili, costanti, espressioni aritmetiche
  • Operatori : somma (+), sottrazione (-), moltiplicazione (*), divisione intera (/), resto (mod)
  • Semantica : quella usuale dell’aritmetica ● espressioni relazionali , formate da:
  • Operandi : variabili, costanti, espressioni aritmetiche
  • Operatori : operatori relazionali di uguaglianza (==), diversità (!=), minoranza (<) e maggioranza (>) fra numeri
  • Semantica : quella delle disequazioni fra numeri ● espressioni logiche e predicati logici , formati da:
  • Operandi : variabili, costanti, espressioni relazionali
  • Operatori : operatori logici , tra cui congiunzione (AND), disgiunzione (OR) e negazione (NOT)
  • Semantica : quella dell' Algebra di Boole (logica proposizionale) Algebra di Boole - Operatori
  • Negazione not A ¬ A – A
  • Congiunzione A and B A ∧ B A × B
  • Disgiunzione A or B A ∨ B A + B
  • Disgiunzione esclusiva A xor B A ^ B A ⊕ B
  • Implicazione se…allora A → B A ⇒ B
  • Doppia implicazione se e solo se A ↔ B A ⇔ B Queste compaiono nelle istruzioni di controllo.

Schemi a blocchi

Come ideare un algoritmo (SB)

Un algoritmo può essere rappresentato in forma grafica attraverso gli schemi a blocchi (detti anche diagrammi di flusso o flow chart). I blocchi di input (x ←) e output (← x) hanno forme trapezoidali, per l’input si dà un valore alla variabile x, per l’output si visualizza il valore della variabile x. L’ elaborazione ha forma rettangolare, all’interno va l'istruzione di assegnamento. Le istruzioni di controllo ( selezione a 2 vie ) hanno forma di rombo con due archi uscenti, al suo interno vi è il predicato, detta anche espressione condizionale, che è composta dagli operatori relazionali/logico-relazionali. Le freccette hanno segnato Si/No oppure Vero/Falso. Il sottoprogramma è un rettangolo sbarrato, è un’operazione non elementare, indica un altro algoritmo. La funzione restituisce un valore, la procedura no! Esempi di algoritmi a schema a blocchi Problema 1. Visualizzare il massimo ( max ) tra due interi ( x e y ) acquisiti da tastiera. (La funzione max deve essere spiegata al calcolatore, strutturata e dotata di struttura a blocchi.) Algoritmo :

  1. Acquisisci un intero e memorizzalo in x
  2. Acquisisci un intero e memorizzalo in y
  3. Assegna a max il valore di x
  4. Se il dato y > max allora vai al passo 5; altrimenti vai al passo 6
  5. Assegna a max il valore di y
  6. Visualizza il valore di max
  7. Fine

P 2. Visualizzare il massimo ( max ) di 10 interi acquisiti ( x ) da tastiera. Algoritmo :

  1. Acquisisci un valore e memorizzalo in x
  2. Assegna a max il valore di x
  3. Assegna a i il valore di 1
  4. Se i ≤ 10 allora vai al passo 5; altrimenti vai al passo 9
  5. Acquisisci un valore e memorizzalo in x
  6. Assegna a max il massimo tra x e max
  7. Incrementa i di 1 unità
  8. Vai al passo 4
  9. Visualizza max
  10. Fine Se ho un grosso problema posso dividerlo in sottoproblemi (es. in questo caso massimo che posso ricavare dall’algoritmo P 1 ) , dandoli per assodati. Per progettare un algoritmo di grandi dimensioni si possono usare due differenti metodi:
  • metodo TOP-DOWN : si risolve prima il problema principale in generale, poi si provvede a risolvere i sottoproblemi
  • metodo BOTTOM-UP : si risolvono prima i sottoproblemi per poi proseguire con il risolvimento del problema principale.

Schema a blocchi strutturato

Esistono dei vincoli da rispettare per progettare dei buoni programmi. Uno schema a blocchi si dice strutturato se ha schema di inizio, schema di fine e un blocco strutturato composto (BSC), che può essere una struttura di controllo (quindi selezione, controllo, ripetizione), un blocco funzionale semplice o un blocco nullo. Strutture di controlloSequenza : sono dei comandi uno di seguito all’altro → operazione a cascata;

Blocco funzionale semplice (la circostanza determina la condizione) Il linguaggio degli schemi a blocchi è talmente espressivo da poter esprimere qualsiasi algoritmo. ● Potenza computazionale : ammette almeno un algoritmo per ogni problema solubile; ● Potenza espressiva : ammette tutti gli algoritmi possibili per ogni problema solubile. Tra due schemi a blocchi abbiamo differenti equivalenze: ● Equivalenza debole : due schemi a blocchi sono debolmente equivalenti se per ogni ingresso (input) danno gli stessi risultati e quindi risolvono lo stesso problema; ● Equivalenza forte : due schemi a blocchi sono fortemente equivalenti se per ogni ingresso (input) danno le stesse sequenze di computazione (sequenza di istruzioni che vengono eseguite). Forte ⇒ (implica) Debole Debole ⇏ (non implica) Forte

SB generici e SBS

Teorema di Boem-Jacopin i: per ogni SB non strutturato esiste uno SBS debolmente equivalente (ottenibile attraverso trasformazione funzionale ) ● SBS permette di risolvere ogni problema solubile Dal punto di vista funzionale SBS è potente quanto SB! ● SBS non permette di rappresentare ogni possibile algoritmo Dal punto di vista algoritmico SBS è meno potente di SB!

Altre strutture di controllo tipiche

Esistono costrutti aggiuntivi per risolvere algoritmi in maniera più sintetica e compatta: ● Ciclo a condizione finale : iterazione per falso, se il controllo per l’arresto dell’iterazione è posto dopo il gruppo di istruzione da ripetere. ● Struttura condizionale multipla : ● Ciclo controllato da contatore : traccia le operazioni con la variabile contatore.

In informatica ciascuno di questi simboli è una cifra in base due, quindi un bit. Una sequenza di 8 bit è chiamata byte e si considerano i suoi multipli: Le unità di misura nella tabella di sinistra sono più utilizzate quando si parla di capacità di memorizzazione oppure di networking (quando acquisti una nuova memoria il venditore è interessato a utilizzare queste grandezze in quanto sono leggermente inferiori). Quando si parla invece per esempio di indirizzamento di memoria si fa più riferimento alla tabella di destra. Avendo n entità informative da codificare, di quanti simboli {0, 1} abbiamo bisogno? Esempio 1. Supponendo di voler codificare i giorni della settimana ● k = 1 → Lun, mar, mer {0} / gio, ven, sab, dom {1} ● k = 2 → Lun, mar {00} / mer {01} / ven, gio {10} / sab, dom {11} ● k = 3 → Lun {000} / mar {001} / mer {010} / gio {011} / ven {100} / sab {101} / dom {110}, ci rimane ancora una configurazione disponibile {111}, a cui possiamo non assegnare significato quindi → k =log 2 n ⎤ e in questo caso k = ⎡log 2 7 ⎤ = 3 (N.B. ⎡⎤ significa con approssimazione per eccesso; ⎣⎦ significa con approssimazione per difetto) Esempio 2 : Se volessimo codificare una poesia, ciascuna parola si dovrà codificare con un simbolo ogni lettera, cifra o punteggiatura che possa apparire: 26 lettere minuscole + 26 lettere maiuscole + 10 cifre + 30 punteggiatura ≈ 90 → ⎡log 2 90 ⎤ = 7 bit

Codifica dei dati non numerici

ASCII (American Standard Code for Information Interchange) : Prevede successioni di 7 bit ed include anche la codifica di caratteri speciali (CANC, ESC, INVIO, ecc.) Esempio ASCII: CIAO → codifica in 7 bit per ogni lettera → 4 lettere x 7 bit = 28 bit

Latin-1 : Estensione di ASCII basato su successioni di 8 bit con i quali è possibile rappresentare lettere accentate ● UNICODE : Basato su successioni di 16 bit che contiene simboli di altri alfabeti, altri simboli (matematici, valute, ecc.) e simboli utili per la scrittura in lingue orientali Nel calcolatore possono inoltre starci anche dei programmi, che possono essere memorizzati come:

  • un testo , sulla base dei singoli simboli/lettere che lo compongono
  • un eseguibile , file eseguiti direttamente dal calcolatore poiché espressi nel linguaggio consono del calcolatore, il linguaggio macchina. Si codifica istruzione per istruzione, a ciascuna istruzione è associata una sequenza di bit a doc → in questo senso i programmi eseguibili sono sequenze di {0, 1}. Le istruzioni del linguaggio macchina sono costituite da campi: ● il codice operativo ● operandi dell’istruzione

Codifica di Numeri Naturali

Il significato della cifra dipende dalla posizione in cui si trova all’interno della successione di cifre Esempio: 4243 = 4 x 10^3 + 2 x 10^2 + 4 x 10^1 + 3 x 10^0 Il significato della cifra dipende dalla posizione assunta all'interno della successione delle cifre ( Notazione posizionale ). È possibile passare dalla base 2 alla base dieci, e viceversa, dando valore alle cifre con potenza di due (2n), invece di potenza di 10 (10n). (^1101) due = 1 x 10^3 due + 1 x 10^2 due + 1 x 10^1 due + 1 x 10^0 due = = 1 x 2^3 dieci + 1 x 2^2 dieci + 0 x 2^1 dieci + 1 x 2^0 dieci = 8dieci + 4dieci + 0dieci + 1dieci = (^13) dieci (^13) dieci = 1 x 10dieci^1 + 3 x 10dieci^0 = = 1due x 1010due^1 + 11due x 1010due^0 = 1010due + 11due = 1101due Questi calcoli risultano semplici ma possono diventare complessi, quindi si può usare un’altra metodologia.

Codifica di Numeri Interi

Con n bit posso rappresentare 2n^ differenti entità informative. Per la rappresentazione degli interi esistono

0110 = 0 x 2^3 + 1 x 2^2 + 1 x 2 + 0 x 2^0 = = 0 + 4 + 2 + 0 = + 1010 = -1 x 2^3 + 0 x 2^2 + 1 x 2 + 0 x 2^0 = = -8 + 0 + 2 + 0 = - Con questo metodo si possono codificare numeri da -2n-1^ a +2n-1^ - 1. Es. con n = 4 bit: 1000 = -8 1111 = -1 0000 = 0 0111 = 7 Quindi, con 4 bit, posso codificare i numeri che vanno da -8 a + Metodi alternativi per ricavare il complemento a due di un numero intero negativo: Supponiamo di voler codificare un numero intero x in complemento a due con n bit ● Primo metodo

  1. Codifico | |𝑥 come naturale aggiungendo 0 quanto basta per arrivare ad una sequenza di n bit
  2. Complemento i bit (= inverto → 0 diventano 1 e viceversa)
  3. Aggiungo una unità Es. x = -6, n = 4 bit → 1. 0110 → 2. 1001 → 3. 1001 + 1 = 1010 ● Secondo metodo
  4. Codifico | |𝑥 come naturale aggiungendo 0 quanto basta per arrivare ad una sequenza di n bit
  5. Partendo da destra verso sinistra si lasciano inalterati i bit fino al primo 1 compreso
  6. Complemento i successivi (= inverto → 0 diventano 1 e viceversa) Es. x = -6, n = 4 bit → 1. 0110 → ⅔. 1010 Estensione del segno Si prende il bit più significativo (primo bit della sequenza) e lo si replica tante volte quando basta per arrivare da una sequenza di n bit ad una sequenza di m bit, con n > m. Es. 1010 = -6, con n = 4 → 11 1010 = -6, con m = 6 (si ha duplicato il bit più significativo 1) Operazioni aritmetiche Somma e sottrazione in complemento a 2 → si sommano una ad una le cifre, considerando i riporti, trasformando in base due. 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 = 0 con riporto di 1 La sottrazione segue le stesse regole della somma: x - y = x + (- y) Esempio. 5 - 8 = 5 + (- 8) → con 6 bit

Esempio. 26 - 13 = 26 + (-13) → con 6 bit Si parla di overflow nel caso in cui si superi l’intervallo di numeri supportati dai bit, quando il risultato è troppo grande per essere rappresentato dal numero finito di bit, ma anche nel caso in cui il segno del risultato è diverso rispetto a quello aspettato. Esempio. Sommando due positivi abbiamo ottenuto un negativo: Se gli ultimi due riporti sono differenti c’è stato l’ overflow/traboccamento. Esempio. -100 - 60 = -100 + (-60) → con 8 bit