Operatori logici
Operatori logici
Introduzione al linguaggio C
Operatori logici
Copyright © 1997 by Mario G. Montobbio
All rights reserved. No part of this publication may be reproduced,
stored in a retrieval system, or transmitted, in any form or by any
means, electronic, mechanical, photocopying, recording, or
otherwise, without the prior written permission of the author.
Permission to use, copy and distribute this publication for the
purposes of research or private study without fee is hereby granted,
provided that this copyright notice and this permission notice appear
in all copies.
Mario G. Montobbio
mailto:[email protected]
Introduzione al linguaggio C
Prodotto logico
Prodotto logico
(AND)
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Costruiamo una semplice funzione main ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... che contiene due aree denominate aValore1 ed aValore2.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
In questo esempio inizializziamo le aree aValore1 ed aValore2
combinando le potenze di 16: 16º=1, 16¹=16, 16²=256, 16³=4096.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore1 al valore esadecimale X’FC30’ ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... costruito sommando il valore esadecimale X’F000’, ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... il valore esadecimale X’0C00’, ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... e il valore esadecimale X’0030’.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Il coefficiente di 16º è zero, di conseguenza l’ultima cifra in esadecimale
del valore dell’area aValore1 è X’0’.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore2 al valore esadecimale X’C3F0’ ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... costruito sommando il valore esadecimale X’C000’, ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... il valore esadecimale X’0300’, ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... e il valore esadecimale X’00F0’.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Il coefficiente di 16º è zero, di conseguenza l’ultima cifra in esadecimale
del valore dell’area aValore2 è X’0’.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Calcoliamo il prodotto logico del contenuto di aValore1 ed aValore2
nell’area aRisultato.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Stampiamo le aree di partenza aValore1 ed aValore2; ed il loro
prodotto logico calcolato in aRisultato.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Questi sono i modelli delle linee da stampare.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Ogni % è un segnaposto che sarà sostituito ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... dal contenuto dell’area nel secondo argomento ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... allineato verso sinistra ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... per una lunghezza di 8 cifre ...
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
... in esadecimale.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 & aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
AND = %-.8X\n”, aRisultato);
}
Sulla riga del risultato riportiamo l’operazione logica.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova9.c
home/mntmgs/clang>
Abbiamo introdotto il codice simbolico in prova9.c.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova9.c
home/mntmgs/clang>
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova9.c
home/mntmgs/clang>
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza
che siano stati emessi messaggi di errore: vuole dire che il codice non
contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha
creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
... che si trova nella directory corrente.
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi i
due valori ed il loro prodotto logico in esadecimale.
Introduzione al linguaggio C
Analisi del risultato
Analisi del risultato
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
Questa tabella riepiloga il funzionamento dell’operatore &.
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
Nell’angolo in alto a sinistra è riportato l’operatore che stiamo applicando.
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
La prima colonna in basso a sinistra contiene tutti i valori (logici) possibili
per il primo operando.
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
Nella prima riga in alto a destra ci sono tutti i valori (logici) possibili per il
secondo operando.
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
Nell’angolo in basso a destra ci sono tutti i possibili risultati ottenuti
combinando gli operandi.
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
0 & 0 = 0
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
0 & 1 = 0
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
1 & 0 = 0
Introduzione al linguaggio C
Prodotto logico
&
0
1
Operando 2
0
0
0
Risultato
1
0
1
1 & 1 = 1
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
Richiamando il modulo caricabile-eseguibile a.out vengono emessi i due
valori ed il loro prodotto logico in esadecimale.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
Analizziamo il risultato applicando la tabella dell’operatore &.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
Il contenuto di aValore1 e di aValore2 è stato scelto in modo da
comprendere tutte le possibili situazioni.
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
0 & 0 = 0
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
0 & 1 = 0
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
1 & 0 = 0
Introduzione al linguaggio C
Prodotto logico
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------AND = 0000C030
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
1100 0000 0011 0000
C
0
3
0
Binario
Esadecimale
aRisultato (AND)
1 & 1 = 1
Introduzione al linguaggio C
Somma logica
Somma logica
(OR)
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Costruiamo una semplice funzione main ...
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
... che contiene due aree denominate aValore1 ed aValore2.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
In questo esempio inizializziamo le aree aValore1 ed aValore2
combinando le potenze di 16: 16º=1, 16¹=16, 16²=256, 16³=4096.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore1 al valore esadecimale X’FC30’.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore2 al valore esadecimale X’C3F0’.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Calcoliamo la somma logica del contenuto di aValore1 ed aValore2
nell’area aRisultato.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Stampiamo le aree di partenza aValore1 ed aValore2; e la loro somma
logica calcolata in aRisultato.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Questi sono i modelli delle linee da stampare.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Ogni % è un segnaposto che sarà sostituito ...
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
... dal contenuto dell’area nel secondo argomento ...
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
... allineato verso sinistra ...
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
... per una lunghezza di 8 cifre ...
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
... in esadecimale.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 | aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
OR = %-.8X\n”, aRisultato);
}
Sulla riga del risultato riportiamo l’operazione logica.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova10.c
home/mntmgs/clang>
Abbiamo introdotto il codice simbolico in prova10.c.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova10.c
home/mntmgs/clang>
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova10.c
home/mntmgs/clang>
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza
che siano stati emessi messaggi di errore: vuole dire che il codice non
contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha
creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
... che si trova nella directory corrente.
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi i
due valori ed la loro somma logica in esadecimale.
Introduzione al linguaggio C
Analisi del risultato
Analisi del risultato
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
Questa tabella riepiloga il funzionamento dell’operatore |.
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
Nell’angolo in alto a sinistra è riportato l’operatore che stiamo applicando.
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
La prima colonna in basso a sinistra contiene tutti i valori (logici) possibili
per il primo operando.
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
Nella prima riga in alto a destra ci sono tutti i valori (logici) possibili per il
secondo operando.
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
Nell’angolo in basso a destra ci sono tutti i possibili risultati ottenuti
combinando gli operandi.
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
0 | 0 = 0
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
0 | 1 = 1
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
1 | 0 = 1
Introduzione al linguaggio C
Somma logica
|
0
1
Operando 2
0
0
1
Risultato
1
1
1
1 | 1 = 1
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
Richiamando il modulo caricabile-eseguibile a.out vengono emessi i due
valori ed il loro prodotto logico in esadecimale.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
Analizziamo il risultato applicando la tabella dell’operatore |.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
Il contenuto di aValore1 e di aValore2 è stato scelto in modo da
comprendere tutte le possibili situazioni.
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
0 | 0 = 0
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
0 | 1 = 1
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
1 | 0 = 1
Introduzione al linguaggio C
Somma logica
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------OR = 0000FFF0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
aRisultato (OR)
1111 1111 1111 0000
F
F
F
0
Binario
Esadecimale
1 | 1 = 1
Introduzione al linguaggio C
Or esclusivo
Or esclusivo
(XOR)
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Costruiamo una semplice funzione main ...
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
... che contiene due aree denominate aValore1 ed aValore2.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
In questo esempio inizializziamo le aree aValore1 ed aValore2
combinando le potenze di 16: 16º=1, 16¹=16, 16²=256, 16³=4096.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore1 al valore esadecimale X’FC30’.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore2 al valore esadecimale X’C3F0’.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Calcoliamo l’or esclusivo del contenuto di aValore1 ed aValore2
nell’area aRisultato.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Stampiamo le aree di partenza aValore1 ed aValore2; ed il loro or
esclusivo calcolato in aRisultato.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Questi sono i modelli delle linee da stampare.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Ogni % è un segnaposto che sarà sostituito ...
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
... dal contenuto dell’area nel secondo argomento ...
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
... allineato verso sinistra ...
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
... per una lunghezza di 8 cifre ...
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
... in esadecimale.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aValore2 = (12 * 4096) + (3 * 256)
+ (15 * 16);
int aRisultato;
aRisultato = aValore1 ^ aValore2;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“Valore 2 = %-.8X\n”, aValore2);
printf (“-------------------\n”);
printf (“
XOR = %-.8X\n”, aRisultato);
}
Sulla riga del risultato riportiamo l’operazione logica.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova11.c
home/mntmgs/clang>
Abbiamo introdotto il codice simbolico in prova11.c.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova11.c
home/mntmgs/clang>
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova11.c
home/mntmgs/clang>
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza
che siano stati emessi messaggi di errore: vuole dire che il codice non
contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha
creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
... che si trova nella directory corrente.
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi i
due valori ed il loro or esclusivo in esadecimale.
Introduzione al linguaggio C
Analisi del risultato
Analisi del risultato
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
Questa tabella riepiloga il funzionamento dell’operatore ^.
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
Nell’angolo in alto a sinistra è riportato l’operatore che stiamo applicando.
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
La prima colonna in basso a sinistra contiene tutti i valori (logici) possibili
per il primo operando.
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
Nella prima riga in alto a destra ci sono tutti i valori (logici) possibili per il
secondo operando.
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
Nell’angolo in basso a destra ci sono tutti i possibili risultati ottenuti
combinando gli operandi.
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
0 ^ 0 = 0
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
0 ^ 1 = 1
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
1 ^ 0 = 1
Introduzione al linguaggio C
Or esclusivo
^
0
1
Operando 2
0
0
1
Risultato
1
1
0
1 ^ 1 = 0
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
Richiamando il modulo caricabile-eseguibile a.out vengono emessi i due
valori ed il loro prodotto logico in esadecimale.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
Analizziamo il risultato applicando la tabella dell’operatore |.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
Il contenuto di aValore1 e di aValore2 è stato scelto in modo da
comprendere tutte le possibili situazioni.
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
0 ^ 0 = 0
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
0 ^ 1 = 1
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
1 ^ 0 = 1
Introduzione al linguaggio C
Or esclusivo
1
2
3
4
5
6
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
Valore 2 = 0000C3F0
------------------XOR = 00003FC0
home/mntmgs/clang>
aValore1
1111 1100 0011 0000
F
C
3
0
Binario
Esadecimale
aValore2
1100 0011 1111 0000
C
3
F
0
Binario
Esadecimale
0011 1111 1100 0000
3
F
C
0
Binario
Esadecimale
aRisultato (XOR)
1 ^ 1 = 0
Introduzione al linguaggio C
Negazione
Negazione
(NOT)
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Costruiamo una semplice funzione main ...
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
... che contiene un’area denominate aValore1.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
In questo esempio inizializziamo l’area aValore1 combinando le potenze
di 16: 16º=1, 16¹=16, 16²=256, 16³=4096.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Inizializziamo l’area aValore1 al valore esadecimale X’FC30’.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Calcoliamo la negazione del contenuto di aValore1 nell’area
aRisultato.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Stampiamo l’area di partenza aValore1 e la sua negazione calcolata in
aRisultato.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Questi sono i modelli delle linee da stampare.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Ogni % è un segnaposto che sarà sostituito ...
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
... dal contenuto dell’area nel secondo argomento ...
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
... allineato verso sinistra ...
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
... per una lunghezza di 8 cifre ...
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
... in esadecimale.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
main (void)
{int aValore1 = (15 * 4096) + (12 * 256)
+ (3 * 16);
int aRisultato;
aRisultato = ~ aValore1;
printf (”Valore 1 = %-.8X\n”, aValore1);
printf (“-------------------\n”);
printf (“
NOT = %-.8X\n”, aRisultato);
}
Sulla riga del risultato riportiamo l’operazione logica.
Introduzione al linguaggio C
Compilazione
Compilazione
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova12.c
home/mntmgs/clang>
Abbiamo introdotto il codice simbolico in prova12.c.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova12.c
home/mntmgs/clang>
Richiamiamo il compilatore C con il comando cc.
Introduzione al linguaggio C
Compilazione
1
2
home/mntmgs/clang>cc prova12.c
home/mntmgs/clang>
Dopo la compilazione otteniamo nuovamente il prompt del sistema senza
che siano stati emessi messaggi di errore: vuole dire che il codice non
contiene errori.
Introduzione al linguaggio C
Elaborazione
Elaborazione
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
Poiché non abbiamo specificato un nome scelto da noi, il compilatore ha
creato un modulo caricabile-eseguibile chiamato a.out ...
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
... che si trova nella directory corrente.
Introduzione al linguaggio C
Elaborazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
Richiamando il modulo caricabile-eseguibile a.out ora vengono emessi il
valore originale e la sua negazione in esadecimale.
Introduzione al linguaggio C
Analisi del risultato
Analisi del risultato
Introduzione al linguaggio C
Negazione
~
1
1
0
Questa tabella riepiloga il funzionamento dell’operatore ~.
Introduzione al linguaggio C
Risultato
0
Negazione
~
1
1
0
Risultato
0
Nell’angolo in alto a sinistra è riportato l’operatore che stiamo applicando.
Introduzione al linguaggio C
Negazione
~
1
1
0
Risultato
0
La prima colonna a sinistra contiene tutti i valori (logici) possibili per
l’operando.
Introduzione al linguaggio C
Negazione
~
1
1
0
Risultato
0
Nella colonna di destra ci sono tutti i possibili risultati ottenuti applicando
l’operatore all’operando.
Introduzione al linguaggio C
Negazione
~
1
1
0
~ 0 = 1
Introduzione al linguaggio C
Risultato
0
Negazione
~
1
1
0
~ 1 = 0
Introduzione al linguaggio C
Risultato
0
Negazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
0000 0000 0000 0000 1111 1100 0011 0000
0
0
0
0
F
C
3
0
Binario
Esadecimale
1111 1111 1111 1111 0000 0011 1100 1111
F
F
F
F
0
3
C
F
Binario
Esadecimale
Richiamando il modulo caricabile-eseguibile a.out vengono emessi il
valore originale e la sua negazione in esadecimale.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
0000 0000 0000 0000 1111 1100 0011 0000
0
0
0
0
F
C
3
0
Binario
Esadecimale
1111 1111 1111 1111 0000 0011 1100 1111
F
F
F
F
0
3
C
F
Binario
Esadecimale
Analizziamo il risultato applicando la tabella dell’operatore ~.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
0000 0000 0000 0000 1111 1100 0011 0000
0
0
0
0
F
C
3
0
Binario
Esadecimale
1111 1111 1111 1111 0000 0011 1100 1111
F
F
F
F
0
3
C
F
Binario
Esadecimale
Il contenuto di aValore1 è stato scelto in modo da comprendere tutte le
possibili situazioni.
Introduzione al linguaggio C
Negazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
0000 0000 0000 0000 1111 1100 0011 0000
0
0
0
0
F
C
3
0
Binario
Esadecimale
1111 1111 1111 1111 0000 0011 1100 1111
F
F
F
F
0
3
C
F
Binario
Esadecimale
~ 0 = 1
Introduzione al linguaggio C
Negazione
1
2
3
4
5
home/mntmgs/clang>./a.out
Valore 1 = 0000FC30
------------------NOT = FFFF03CF
home/mntmgs/clang>
0000 0000 0000 0000 1111 1100 0011 0000
0
0
0
0
F
C
3
0
Binario
Esadecimale
1111 1111 1111 1111 0000 0011 1100 1111
F
F
F
F
0
3
C
F
Binario
Esadecimale
~ 1 = 0
Introduzione al linguaggio C
Operatori logici
Copyright © 1997 by Mario G. Montobbio
All rights reserved. No part of this publication may be reproduced,
stored in a retrieval system, or transmitted, in any form or by any
means, electronic, mechanical, photocopying, recording, or
otherwise, without the prior written permission of the author.
Permission to use, copy and distribute this publication for the
purposes of research or private study without fee is hereby granted,
provided that this copyright notice and this permission notice appear
in all copies.
Mario G. Montobbio
mailto:[email protected]
Introduzione al linguaggio C
Scarica

Operatori logici