binari Capire i numeri binari. Francesco Melis su smanettando, 19\01\2013, h.22.47. Il sistema di numerazione binario. In questo post descriverò un esempio che porto nei corsi di formazione che spiega in termini molto elementari il sistema di numerazione binario. La metodica usata è quella di spostare il problema in discussione su un altro piano: quello dell'esperienza diretta quotidiana delle persone. Si sposta quindi il vero problema su un'altra questione, familiare per chiunque, dimodoché sia facile ed intuitivo coglierne la logica. Una volta capito il meccanismo funzionale sottostante la situazione familiare descritta, con un processo di astrazione, si coglie quella che è la "struttura" del problema e la si traspone, si spera in maniera indolore, nel campo dell'argomento tecnico del quale si sta trattando. L'obbiettivo è quello di far capire con un esempio molto semplice che cos'è, come è costituito e come si legge un numero binario. Tutte le tematiche teoriche e gli approfondimenti quindi sono demandati ad un manuale di studio. Per capire la logica del sistema di numerazione binario, cioè quel misterioso sistema usato nei calcolatori e costituito di soli 0 ed 1 useremo una... bilancia. Sì, avete capito bene! Una bilancia. La bilancia che dovete pensare è quella di precisione dei farmacisti o degli orafi, quella con i due piattini con le catenelle. Per pesare con queste bilance, cosa nota a tutti, si pone su un piatto la massa da pesare, oro o altri metalli preziosi per gli orafi o sostanze chimiche per il farmacista e si pongono sull'altro piattino uno o più pesi campione. Tutte le bilance di questo tipo dispongono di una collezione di pesi campione, immagino da 100 grammi, 50 grammi, 10 grammi, 5 grammi, 2 grammi, un grammo. Immagino anche che ci siano più esemplari del peso da 1 grammo eccetera. All'inizio della pesata il piatto con la masserella incognita, per il peso, chiaramente scende giù, mentre l'altro piattino, ove ancora non abbiamo posato nessun peso campione, ovviamente rimane su. Ora cominciamo ad aggiungere dei pesi campione sul piattino vuoto. Il piattino comincia leggermente a scendere. Continuiamo ad aggiungere pesi campione fino a quando i due piatti sono perfettamente orizzontali: ciò significa che essendo i due piatti in equilibrio contengono le stesse masse. Il gioco è fatto: basta contare i pesi campione per vedere quanto pesa la masserella incognita. Se per creare l'equilibrio abbiamo dovuto usare la massa da 10 grammi, quella da 2 grammi e quella da 1 grammo allora la massa incognita sarà ovviamente 10+2+1 = 13 grammi. Fin qui credo che non ci piova e, anzi... forse sarebbero bastate anche molte meno parole di quante ne ho usato per spiegare una cosa che è veramente banale e facente parte dell'esperienza di tutti. Bene. Ora immaginiamo una bilancia di questo tipo appena detto, solo che il pizzicagnolo che ce l'ha prestata è un tipo un po' originale e si è organizzato a modo suo in questa maniera. La rastrelliera con i pesi campione da usare per creare l'equilibrio dei piatti contiene un unico esemplare di ogni pesetto e questi, bontà sua, sono: il peso da 16 grammi, il peso da 8 grammi, il peso da 4 grammi, il peso da 2 grammi ed il peso da 1 grammo. Questa bilancia, lo diciamo subito pesa al massimo fino a 31 grammi, infatti mettendo tutti i pesi campione su un piatto la loro somma è 16 + 8 + 4 + 2 + 1 = 31 grammi. Vediamo se con questa bilancia veramente riusciamo a pesare qualunque masserella fino ad un massimo di 31 grammi. Di seguito faccio un elenco di tutte le possibilità di pesata, dalla più leggera di un grammo fino alla più pesante di 31 grammi. A fianco di ogni valore scriverò quali pesi campione si devono usare per creare l'equilibrio. Per esempio, se la masserella incognita fosse di 11 grammi allora mi serve di usare il pesetto da 8 grammi, quello da due grammi e quello da 1 grammo. Infatti 8+2+1=11 grammi. Tabella delle pesate possibili con la bilancia e pesi campione da usare per creare l'equilibrio. 1 grammo: Uso il peso campione da 1 grammo 2 grammi: 2 3 grammi: 2 + 1 4 grammi: 4 5 grammi: 4 + 1 6 grammi: 4 + 2 7 grammi: 4 + 2 + 1 8 grammi: 8 9 grammi: 8 + 1 10 grammi : 8 + 2 11 grammi: 8 + 2 + 1 12 grammi: 8 + 4 13 grammi: 8 + 4 + 1 14 grammi: 8 + 4 + 2 15 grammi: 8 + 4 + 2 + 1 16 grammi: 16 17 grammi: 16 + 1 18 grammi: 16 + 2 19 grammi: 16 + 2 + 1 20 grammi: 16 + 4 21 grammi: 16 + 4 + 1 22 grammi: 16 + 4 + 2 23 grammi: 16 + 4 + 2 + 1 24 grammi: 16 + 8 25 grammi: 16 + 8 + 1 26 grammi: 16 + 8 + 2 27 grammi: 16 + 8 + 2 + 1 28 grammi: 16 + 8 + 4 29 grammi: 16 + 8 + 4 + 1 30 grammi: 16 + 8 + 4 + 2 31 grammi: 16 + 8 + 4 + 2 + 1 Come si può notare abbiamo potuto fare tutte le pesate possibili pur usando questi strani pesi campione in unico esemplare. Bene! Ora ci serve un altro strumento che tutti abbiamo a disposizione: la nostra mano sinistra. Supponiamo che alla nostra mano sinistra aperta con il palmo rivolto verso l'alto associamo i pesi campione in questa maniera: il pollicione sia il peso da 16 grammi, l'indice sia il peso da 8 grammi, il medio sia il peso da 4 grammi, l'anulare sia il peso da 2 grammi ed il mignolo sia il peso da 1 grammo. Con la mano sinistra aperta in questa maniera il pollicione (16 grammi) si trova a sinistra ed il mignolo (1 grammo) si trova a destra. Bene! Ora prendiamo una masserella da pesare. Io so che la masserella da pesare pesa 21 grammi ma voi non lo sapete e quindi dovete usare la bilancia per determinare la sua massa. Cominciamo a mettere dei pesi campione sul piatto. Metto il 16... uhm! Non basta. Aggiungo il peso da 8... uhm! Troppo! Levo l'otto e ci metto il 4. Beh! Quasi ci siamo... ma ancora pende... Aggiungo il peso da 1. Ah! Ora ci siamo! Abbiamo creato l'equilibrio. La masserella pesa 21 grammi. Vediamo quali dita, (pesi campione), abbiamo usato: il pollice (16 grammi), il medio (4 grammi) ed il mignolo (1 grammo). Ora facciamo questa operazione: le dita che non sono servite le chiudiamo e lasciamo aperte le dita che invece abbiamo usato. Osserviamo quindi che il pollice sta aperto, l'indice è chiuso, il medio è aperto, l'anulare è chiuso ed il mignolo è aperto. Adesso annotiamo un fatto: scriviamo su un pezzo di carta o dove pare a voi questo che sto per dirvi. Per ogni dito della mano sinistra scriveremo sul pezzo di carta un 1 od uno 0 a seconda che il dito sia stato preso in considerazione o meno per fare la pesata. Occorre scrivere quindi in ogni caso cinque cifre affiancate costituite dallo zero o dall'uno. Nel caso della pesata da 21 grammi appena vista allora avrò: 1) Mi è servito il pollice ed allora scriverò un 1 2) Non mi è servito l'indice e scriverò uno 0 3) Mi è servito il medio ed allora scriverò un 1 4) Non mi è servito l'anulare e scriverò uno 0 5) Mi è servito il mignolo ed allora scriverò un 1 Osserviamo allora i nostri cinque numeretti: 10101 Beh! Che ci crediate o no questa è la rappresentazione nel sistema di numerazione binario del numero decimale 21. Ogni cifra binaria, cioè lo 0 o l'1 si chiama bit. Vediamo ora un'altra pesata stavolta espressa in binario da interpretare: 10001 Beh! Qui è chiaro che è stato usato il pollice (16 grammi) ed il mignolo (1 grammo). Il numero decimale corrispondente è quindi 16+1=17 Penso che non sia il caso di stare a farla tanto lunga. Spero che l'esempio sia servito a capire come si legge e come si compone un numero binario avente un certo valore. Il numero binario si legge scandendo tutte le cifre uno, uno, zero, zero eccetera... Di seguito scrivo tutta la tabella da 1 fino a 31 in cui il primo numero è il decimale ed a destra la sua rappresentazione in binario, tanto ormai avete capito il giochetto. Essa servirà a controllare i vostri esercizi se vi andrà di farli. Decimale; binario 1 00001 2 00010 3 00011 4 00100 5 00101 6 00110 7 00111 8 01000 9 01001 10 01010 11 01011 12 01100 13 01101 14 01110 15 01111 16 10000 17 10001 18 10010 19 10011 20 10100 21 10101 22 10110 23 10111 24 11000 25 11001 26 11010 27 11011 28 11100 29 11101 30 11110 31 11111 Bene, sperando di essere stato chiaro, con questo concludo questa piccola introduzione e se la cosa vi ha interessato potete pormi delle domande (e ce ne stanno!!). Con una raccomandazione ragionevole. Nella vita, io, come tutti, ho diverse cose da pensare per cui i miei contributi saranno conseguenti ai miei impegni in termini di tempo e quindi le risposte arriveranno quando avrò il modo. *** d. se ti fosse possibile, potresti anche indicare qualche esercizio da fare , anche se non si può pretendere da te che faccia pure le correzioni degli esercizi... r. il post sui numeri binari l'ho congegnato in modo tale che se qualcuno ha voglia di fare qualche esercizio può controllarne da sè la correttezza andando a vedere la tabellina finale in cui per ogni numero da 1 a 31 vi è a fianco la rappresentazione in binario. Per esempio potreste prendere un numero a caso, per esempio facciamo il 14. Ovviamente nel gioco della bilancia il peso in effetti già lo sapete in quanto lo avete scelto voi, in questo caso il 14, e la bilancia in effetti serve a vedere quali pesi campione occorre usare per arrivare a comporre la massa di 14 grammi per arrivare all'equilibrio della bilancia. Individuate qual è il peso più grosso che potete mettere sulla bilancia che ovviamente non superi 14 e mettetelo sul piatto. Ovviamente è il peso 8 dato che il 16 già sforerebbe e non andrebbe affatto bene. Poi aggiungete mano a mano i pesi considerando sempre quello più grosso che potrebbe entrare in quella situazione. Adesso sulla bilancia ho il peso 8 e chiaramente posso aggiungere il 4 dato che "non sforo". 8 + 4 fa 12 e ancora non siamo all'equilibrio. Aggiungo allora il 2 e sono arrivato all'equilibrio: infatti 8 + 4 + 2 = 14. Ho usato l'indice (peso 8), il medio (peso 4) e l'anulare (peso 2), tutte le altre dita rimangono chiuse. Adesso comincio a scrivere sul pezzo di carta gli 1 e gli 0 partendo dal pollice. Il pollice non l'ho preso allora scrivo 0. l'indice l'ho preso ed allora scrivo 1 il medio l'ho preso ed allora scrivo 1 l'anulare l'ho preso ed allora scrivo 1 il mignolo non l'ho preso ed allora scrivo 0 Complessivamente quindi vi ritrovate il numero binario 01110 che se andate a controllare sulla tabellina è proprio 14. Potete fare le prove con tutti i valori da 0 fino a 31 e controllare quindi il vostro risultato sulla tabellina. Potete anche fare il viceversa. Scrivete a caso un numero binario di 5 bit e determinatene il valore decimale. Anche in questo caso la tabellina può servire come verifica di controllo. Sicuramente molti di voi ci avranno già pensato. Ma come si fa a contare numeri più grandi di 31? diciamo fino a 255? Beh! ovviamente ci vuole la mano di ET l'extraterrestre che ha 8 dita... (in effetti mi pare che ne avesse 3 però fa niente... passatemi la licenza!). In tal caso la mano di ET avrà associato alle dita, partendo dal dito alla estrema sinistra, i seguenti valori che sono, notate bene, di valore sempre doppio rispetto al dito immediatamente alla destra. Primo dito a sinistra: peso 128 grammi Secondo dito da sinistra: peso 64 grammi Terzo dito da sinistra: peso 32 grammi Quarto dito da sinistra: peso 16 grammi Quinto dito da sinistra: peso 8 grammi Sesto dito da sinistra: peso 4 grammi Settimo dito da sinistra: peso 2 grammi Ottavo dito da sinistra: peso 1 grammo Se fate la somma degli 8 numeri corrispondenti ai pesi associati alle dita di ET abbiamo 128+64+32+16+8+4+2+1=255 Che è la pesata massima ottenibile con 8 bit. Ovviamente fra i numeri c'è anche lo 0 rappresentato in binario con 00000000 per cui tutti i numeri rappresentabili da 8 bit sono i 255 visti prima più lo 0. In tutto sono 256 numeri. Bene! un numero di 8 cifre, (meglio se diciamo 8 bit), può rappresentare 256 numeri diversi e si chiama... byte!!!! Sì il famoso byte è quindi semplicemente un numero binario di 8 bit. Il numero massimo rappresentabile è 255 e rappresenta uno di 256 possibili numeri. Ogni cifra binaria costituente questo numero di 8 cifre si chiama bit. Ma ci avete pensato? la vostra barra braille è ad 8 punti. Mmmm! e quanti caratteri diversi può rappresentare il braille ad 8 punti? ma 256 caratteri ovvio! non vi dice niente questa somiglianza? E se invece la barra è a 6 punti. Beh! facile! 2 elevato 6 caratteri cioè 64 caratteri. Insomma fra braille e binario c'è una strettissima correlazione! diciamo che sono quasi la stessa cosa. Se il punto c'è allora 1, se invece è abbassato allora 0! *** d. Allora aggiungo una domanda: e se dovessi scrivere un numero maggiore di 31? Per esempio 54? Oppure non serve? r. per rappresentare numeri più grandi di 31, o in generale qualunque numero, occorre capire quanti bit ci vogliono per rappresentarlo. Dal momento che si è capito che tutto gioca con i "pesi" è chiaro che ci vuole qualche altro pesetto in più rispetto ai cinque pesi associati alle dita della mano sinistra. L'esempio con le dita della mano sinistra l'ho portato per capire il principio della numerazione binaria ed è chiaro che per rappresentare numeri più grandi ci vogliono più dita, o meglio dire più bit. Nel caso del numero 54 ci serve per forza il peso da 32 grammi. In ogni caso ricordati che devi sempre rappresentare tutti i bit, anche dei pesi che non hai usato, (con lo 0). 54 si compone così: 32 grammi sì 16 grammi sì 8 grammi no 4 grammi sì 2 grammi sì 1 grammo no in definitiva 110110 nota che adesso i bit sono 6 altrimenti non puoi rappresentare il 54. Con 6 bit (esattamente come nel braille a 6 punti) rappresenti tutti i numeri fino al 63 che con lo 0 (spazio in braille) fanno 64. Nota anche che puoi aggiungere tutti gli zeri che vuoi alla sinistra perché il numero non cambia. E' solo rappresentato con più bit ma il suo valore è sempre lo stesso. Quindi posso rappresentare per esempio il 2 in questa maniera: 10 ma anche 010, oppure 00000010. Diversa è la questione se aggiungi degli 0 a destra. Allora il numero cambia eccome! e sai come cambia? mettendo uno 0 a destra hai moltiplicato il numero per 2. Esempio: prendi il 3 cioe in binario 011. Adesso mettici uno 0 a destra e diventa 0110. Questo numero presenta i pesi 2 e 4 cioè vale 6 che è il doppio di 3. Pare superfluo dirlo ma per calcolare il valore del numero devi partire da destra. Cioè ragionando così come in questo esempio del numero 47 che in binario si rappresenta con 101111 Partendo da destra abbiamo: c'è il peso 1 c'è il peso 2 c'è il peso 4 c'è il peso 8 non c'è il peso 16 c'è il peso 32 Adesso fai la somma dei pesi presenti nel numero: 1+2+4+8+32=47 Adesso di sotto incollo un metodo (algoritmo) più formale per rappresentare in binario un numero qualunque (purché sia positivo, cioè in valore assoluto, perché per rappresentare anche i numeri negativi è un po' più doloroso e non è ancora il momento perché cambiano molte carte in tavola). La difficoltà con il metodo algoritmico ora aumenta dato che usciamo dal familiare visto finora in cui abbiamo contato con le dita e si entra un po' nella metodologia di pensiero con cui si creano i programmi. L'esempio è tratto dalle mie dispensine: Algoritmo di conversione dal decimale al binario Passo N° 1: prendi il numero decimale Passo N° 2: se il numero è 0 vai al passo 7 altrimenti vai al passo 3 Passo N° 3: dividi il numero per 2 Passo N° 4: scrivi il resto della divisione in un foglio Passo N° 5: scrivi il quoziente e consideralo come un nuovo numero Passo N° 6: vai al passo 2 Passo N° 7: scrivi i resti delle divisioni in ordine inverso rispetto all'ordine in cui sono stati generati Passo N° 8: STOP Esempio: convertire il numero 59 in binario. 59 : 2 = 29 resto = 1 29 : 2 = 14 resto = 1 14 : 2 = 7 resto = 0 7 : 2 = 3 resto = 1 3 : 2 = 1 resto = 1 1 : 2 = 0 resto = 1 Il numero binario si ottiene scrivendo i resti in ordine inverso cioè 111011. *** d. lascia stare! stanotte non ho chiuso occhio perchè stavo divertendomi a fare i numeri anche più grandi di 256 usando tutti i metodi possibili. ahahhha aiuto.... che forza...... mi piace molto di più della numerazione decimale mooolto più divertente e avvincente. e santo cielo!....... stanotte leggendo un tuo post sugli hardware e software, avevi detto che un byte misura fino ad un massimo di 256..... allorché ho detto..... cose del tipo.... ma cosa? aiutooo. sto sbagliando...... poi hai confermato la mia intuizione di stanotte.... che lo zero conta. ahahhaah e che cavolo non lo sapevo mica.... ho fatto salti mortali per fare i calcoli pensando di sbagliare sempre e invece il bit più a sinistra degli otto che compongono il byte, da 128 quindi sommando tutto 128+64+32+16+8+4+2+1 è uguale a 255. e li è partito il mio viaggio nel binario del sistema binario. ne sono uscito indenne.... grazie.... leggo con amorevolezza le dispensine..... e con la mia compagna dattilo braille super rumorosa, svolgo somme e sottrazioni. e poi un'altra cosa che mi pare di aver intravisto all'interno di questo sistema incredibile..... e cioè che quando sommi i vari pesi di ogni bit a partire da sinistra a quello di destra, il campione di misurazione è sempre un numero prima del campione di misurazione successivo. esempio... se sommo 3 più 2 più 1, ottengo 7 che è un numero prima di 8....... è come se i vari valori si incastrassero nella potenza di 2.... quindi se prendessi per esempio 8 più 4 più 2 più 1 il risultato è 15 che guarda caso è dispari e guarda caso si ferma prima della potenza successiva della nostra bilanciona binaria. ahahahah dici che è una cavolata? un po spiegato male..... è una cosa fresca devo distribuirla bene. r. sono molto contento che ti stia appassionando al sistema binario. In effetti l'Informatica con la I maiuscola parte proprio da questo sistema. Con il tempo manderò anche altri interventi se c'è interesse da parte vostra. Hai detto tutto giusto: è proprio così, 7 viene prima della potenza di 2 successiva che è 8; 15 viene prima della potenza 16 e così via. Adesso timidamente butto li anche qualche rappresentazione un po' più formale: con n bit si rappresentano 2 elevato n numeri binari diversi fra loro (compreso lo 0 ovviamente). Il numero massimo rappresentabile con n bit è pari a (2 alla n) meno 1. Adesso puoi vedere bene perché il kilo informatico è 1024: esso è proprio la potenza 2 elevato 10 ed il numero massimo rappresentabile con 10 bit è 1023. Il mega invece è 2 elevato 20 che tra l'altro per le proprietà delle potenze aventi la stessa base si può anche scrivere 2^10 per 2^10 (il cappelletto è il simbolo di elevazione a potenza). In binario quindi abbiamo grandezze che come nome somigliano alle grandezze decimali però essendo basate sul 2 hanno valori che si discostano un poco dall'equivalente kilo decimale che vale esattamente 1000. Aggiungo anche, come curiosità, che tutti i numeri binari che finiscono con 1 sono dispari e quelli che finiscono per 0 sono pari. Se sei appassionato a queste cose ti divertirà anche conoscere il modo, molto ingegnoso, con il quale si rappresentano in binario i numeri negativi. Ti lascio con questo piccolo mistero che al momento non voglio svelare altrimenti la gente si spaventa e molla tutto... in binario c'è solo lo 0 e l'1 e quindi non c'è il trattino del segno meno da mettere davanti ai numeri per indicare che sono negativi ed allora come si fa a riconoscere che un numero è negativo? In effetti le cose subiscono un notevole ampliamento e quello che vi ho descritto finora, che mantiene ovviamente la sua rilevanza e validità, rientra come caso particolare dei numeri relativi. *** d. Molte grazie: il sistema mi pare un pò simile al scrivere con i numeri esadecimali, mutatis mutandis... r. sì, il binario è somigliante al sistema esadecimale e ci sono delle curiosità in proposito. Intanto, per chi non sa cosa sia il sistema di numerazione esadecimale, diciamo brevemente che è un altro sistema di numerazione usato in informatica dai programmatori e che si fonda sulla base 16. Mentre in binario la base è il 2 ora la base è il 16. In questo sistema le cifre possibili sono un misto di cifre e lettere: 0 1 2 3 4 5 6 7 8 9 A B C D E F, cioè le 10 cifre del sistema decimale più le lettere dalla A alla F. In tutto quindi sono 16 simboli. il significato ed il valore delle cifre è il seguente. le cifre dallo 0 al 9 hanno lo stesso valore come nel sistema decimale mentre per le lettere abbiamo: A = dieci decimale B = undici decimale C = dodici decimale D = tredici decimale E = quattordici decimale F = quindici decimale. Ora i pesi delle cifre di un numero espresso in esadecimale si devono considerare in questa maniera. Partendo dalla cifra più a destra abbiamo: peso 1: l'unità, che in termini di potenze potremo esprimere anche come 16 elevato 0 che da proprio 1); peso 16 (o potenza 16 elevato 1) peso 256 (o potenza 16 elevato 2) peso 4096 (o potenza 16 elevato 3) ecc... Per esempio il numero esadecimale B4 avrà il valore 11 per 16 + 4 = 180 decimale 4 rappresenta le unità. La seconda cifra, B, vale 11 decimale che va moltiplicato per il suo peso che è 16 e ci fornisce complessivamente 11 per 16 più 4 = 180. In esadecimale il modo con cui si calcola il valore del numero si avvicina al modo che usiamo nel sistema decimale. 2013 in decimale infatti significa 3 unità più 1 decina più 0 centinaia più due migliaia. Ogni cifra anche in decimale va moltiplicata per il suo peso. Niente paura comunque! Adesso vi mostro un trucco per scrivere un numero in esadecimale partendo da un numero binario. Prendiamo un byte per esempio 10110100 che vale 180 come sappiamo. Partiamo da destra e prendiamo gli ultimi 4 bit. Essi sono 0100 che hanno valore quattro. Scriviamo allora il valore in esadecimale che come si può vedere dalla tabellina precedente delle cifre esadecimali è proprio 4 e corrisponde quindi anche al suo valore decimale. Prendiamo ora altri 4 bit andando sempre verso sinistra. In questo caso sono proprio gli ultimi 4 bit 1011 più a sinistra che valgono undici decimale e vediamo il suo valore esadecimale vedendo nella tabellina. Il valore di 11 decimale è dato dalla lettera B. Quindi la rappresentazione esadecimale del numero 180 è 10110100 in binario e B4 in esadecimale. In informatica, nel passato, si usava anche il sistema ottale in base 8. Chiunque comunque, per gioco, si può costruire un proprio sistema di numerazione in una base qualunque, ternaria, quaternaria, quinaria eccetera. *** d. no.... ho letto delle cose sui numeri negativi e sul complemento a 2 ma non riesco a capire... mi servirebbe una spiegazione delle tue. perchè gli esempi che ci sono in giro mi risultano difficili da comprendere. r. Materiale didattico on line se ne trova in abbondanza. Di seguito il link per il materiale del corso di programmazione dell'Università di Catania www.diit.unict.it/users/michele/didattica/fondamenti/fondamenti/indice.html Arrivati a questo livello di trattazione del binario, in cui ci si sta occupando delle rappresentazioni complementate, non è più tanto semplice spiegare le cose con esempi terra terra così come ho fatto con l'introduzione al sistema di numerazione binario. Gli esempi che ho riportato in passato sono quelli che uso nei corsi di formazione per centralinisti telefonici o per la formazione tifloinformatica nell'ambito dei processi riabilitativi. Anche se apparentemente banali, essi sono frutto di raffinamenti successivi sviluppati e perfezionati negli anni per essere intesi da persone senza preparazioni specifiche di base. Come avrai notato, praticamente non c'è traccia di notazioni matematiche sofisticate e quel poco che c'è nelle dispense è semplificato quanto basta per far capire le cose senza tuttavia snaturarle. La trattazione degli aspetti di cui si parla ora, essendo avanzati, non rientrano quindi fra gli strumenti didattici adattati che io ho messo a punto per i miei scopi del lavoro tiflodidattico con i disabili della vista. Questo significa che per gli argomenti avanzati occorre cimentarsi con il linguaggio e la notazione che si fa in ambito universitario. Ciò comporta una certa dimestichezza con notazioni matematiche che non sono molto familiari a chi ha una cultura scientifica di livello solo liceale. Mi proverò però a cercare di dare una spiegazione semplice della rappresentazione in complemento a 2 dei numeri binari. Consideriamo un insieme di n cifre binarie, per esempio 8 cifre. Abbiamo quindi 1 byte. In valore assoluto esso rappresenta tutti i numeri in valore assoluto dallo 0 fino al numero 255. Dividiamo il range di questi valori a metà in questa maniera: Il primo intervallo sia quello dei numeri da 0 fino a +127, mentre il secondo intervallo sia quello dei valori da +128 fino a +255. Il primo intervallo è costituito da numeri che hanno il bit più a sinistra pari a 0. 00000000 00000001 00000010 ... ... 01111111 Il secondo intervallo è costituito da numeri che hanno il bit più a sinistra pari ad 1. 10000000 10000001 10000010 ... ... 11111111 Nella rappresentazione in complemento a 2 si fa questa assunzione: Il primo bit a sinistra pari a 0 rappresenta i numeri positivi, percio il byte rappresenta tutti i numeri che vanno da 0 a +127. Il primo bit a sinistra pari ad 1 rappresenta i numeri negativi in quest'ordine: 10000000 è da considerare pari a -128. Il trattino ovviamente significa segno meno. Ciò significa che il primo bit a sinistra in notazione in complemento a 2 deve essere sempre considerato di peso -128. Gli altri bit più a destra vanno considerati con il valore positivo che già conosci. 10000001 vale -127, infatti è -128+1=-127 10000010 vale -126 infatti è -128+2=-126 ... ... 11111111 vale -1 infatti è -128+1+2+4+8+16+32+64=-128+127=-1 Quindi se si guarda l'asse dei numeri la sequenza dei valori rappresentati è da leggersi come nella seguente tabella in cui a sinistra vi è il numero in valore assoluto così come hai visto con i numeri binari senza segno fino ad ora, ed a destra il valore del numero con segno. Fino a 127 le due rappresentazioni corrispondono. A partire da 128 i numeri sono quelli negativi e sarà -128, -127, -126, ..., -1 Piccola curiosità: la tabella non l'ho fatta a mano altrimenti avrei fatto notte. L'ho fatta in un attimo con excel e poi ho incollato nell'editor di testo con il quale scrivo le mail prima di passare queste al programma di posta. Le descrizioni continuano dopo la tabella. 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77 78 78 79 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89 89 90 90 91 91 92 92 93 93 94 94 95 95 96 96 97 97 98 98 99 99 100 100 101 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 109 109 110 110 111 111 112 112 113 113 114 114 115 115 116 116 117 117 118 118 119 119 120 120 121 121 122 122 123 123 124 124 125 125 126 126 127 127 128 -128 129 -127 130 -126 131 -125 132 -124 133 -123 134 -122 135 -121 136 -120 137 -119 138 -118 139 -117 140 -116 141 -115 142 -114 143 -113 144 -112 145 -111 146 -110 147 -109 148 -108 149 -107 150 -106 151 -105 152 -104 153 -103 154 -102 155 -101 156 -100 157 -99 158 -98 159 -97 160 -96 161 -95 162 -94 163 -93 164 -92 165 -91 166 -90 167 -89 168 -88 169 -87 170 -86 171 -85 172 -84 173 -83 174 -82 175 -81 176 -80 177 -79 178 -78 179 -77 180 -76 181 -75 182 -74 183 -73 184 -72 185 -71 186 -70 187 -69 188 -68 189 -67 190 -66 191 -65 192 -64 193 -63 194 -62 195 -61 196 -60 197 -59 198 -58 199 -57 200 -56 201 -55 202 -54 203 -53 204 -52 205 -51 206 -50 207 -49 208 -48 209 -47 210 -46 211 -45 212 -44 213 -43 214 -42 215 -41 216 -40 217 -39 218 -38 219 -37 220 -36 221 -35 222 -34 223 -33 224 -32 225 -31 226 -30 227 -29 228 -28 229 -27 230 -26 231 -25 232 -24 233 -23 234 -22 235 -21 236 -20 237 -19 238 -18 239 -17 240 -16 241 -15 242 -14 243 -13 244 -12 245 -11 246 -10 247 -9 248 -8 249 -7 250 -6 251 -5 252 -4 253 -3 254 -2 255 -1 Per interpretare un numero scritto in complemento a 2 allora si deve vedere il suo primo bit di segno. Se il bit è 0 allora il numero è positivo ed il suo valore lo puoi calcolare con i sistemi che già conosci. Se invece il numero comincia per 1 allora esso è negativo e va letto in questa maniera. Occorre fare la somma di -128 più il valore che ottieni dagli altri bit calcolati con il metodo normale. Per esempio Il byte 10000110 vale -128+2+4=-122 Il byte 11001111 vale -128+1+2+4+8+64=-49 Il byte 01000011 vale +67 Per cambiare di segno un numero scritto in complemento a 2 si possono seguire due metodi. Primo metodo: invertire tutti i bit del numero e sommare 1. Secondo metodo: partendo da destra ed andando verso sinistra occorre scrivere tutti i bit inalterati fino al primo 1 incluso e invertire tutti gli altri bit. Esempio: +30 in binario è 00011110 Il -30 si fa lasciando tutti i bit inalterati partendo da destra fino al primo 1 incluso e invertendo gli altri. +30 = 00011110 -30 = 11100010 Con la notazione in complemento a 2 le operazioni aritmetiche si fanno normalmente così come facciamo in decimale. I computers lavorano internamente con la notazione in complemento a 2. Per esempio, in linguaggio macchina, se nel programma vi è un'istruzione di salto con indirizzamento relativo ad una istruzione contenuta in una determinata cella di memoria, questo salto è rappresentato dal numero di bytes che bisogna aggiungere (salto in avanti), o togliere (salto all'indietro), all'indirizzo della cella attuale, per raggiungere la cella contenente l'istruzione macchina referenziata. Ovviamente i salti in avanti saranno specificati da numeri positivi mentre i salti all'indietro, essendo delle sottrazioni dall'indirizzo base, saranno negativi.Torna all'indice