Lire l'introduction à la page 35.
4.1 Arithmétique en complément
BASE DÉCIMALE
A la page 36, on nous explique que si les signes "+" ou "-" n'existaient pas
dans la base décimale,
il faudrait alors réserver la première position du chiffre pour représenter le
signe.
Prenons un système numérique décimal de 5 positions représenté par 00000 à 99999.
Il n'y aurait pas de problème si tous les nombres étaient positifs.
Mais utilement il existe aussi des nombres négatifs.
Nous allons diviser les nombres en 2 parties égales:
00000 à 49999 sont réservés pour les nombres positifs et
50000 à 99999 sont réservés pour les nombres négatifs.
Ainsi la plage des nombres devient:
49999 (+49999)
.....
00005 (+5)
00004 (+4)
00003 (+3)
00002 (+2)
00001 (+1)
00000 (0)
99999 (-1)
99998 (-2)
.....
50000 (-50000)
Si je vois 90000$ dans mon état de compte de banque, cela indique que je dois
10000$.
Si je dépose 25000$, alors
90000
+ 25000
-----
15000
Je me retrouve avec 15000$. Lors de l'addition, une retenue (carry) est constatée mais n'a aucune influence sur le résultat.
Si ensuite, je retire 20000$
15000
+ 80000
-----
95000
En effet, moins 20000$ (le complément de 20000$) dans ce système est calculé
en retranchant 20000$ de 100000$.
Mais pour réussir le complément il a fallut utiliser un 6ième chiffre:
100000
- 80000
------
20000
Si dans ce système, il ne peut y avoir un 6ième chiffre, alors on modifiera le complément comme suit:
99999 + 1
- 20000
-----
79999 + 1 -> 80000
Question: Si le montant est de 66555$, combien devez-vous ?
Comme 66555 est un nombre négatif (il est entre 50000 et 99999), il faut
trouver son équivalent positif:
99999 + 1
- 66555
-----
33444 + 1 -> 33445
Réponse: Vous devez 33445$.
Avec ce système à 5 chiffres, qu'advient-il si vous excédez 49999 ?
Exemple: 30000$ + 30000$ -> 60000$
Le système indiquera 60000$, c'est-à-dire que vous devez 40000$.
Cependant il existe un témoin de débordement (OVERFLOW)
qui va constater ce fait.
Le programme se doit de vérifier la présence de ce débordement afin d'émettre un
message d'erreur.
Le témoin de retenue (Carry)
n'est pas à être vérifier avec les nombres en complément;
ainsi 99999+00005 -> 00004 générera une retenue qui n'est plus d'actualité.
BASE BINAIRE
A la page 37, on nous explique ce qui se passe avec la base 2.
Prenons l'exemple sur 16 bits qui est la taille des mots mémoire avec PEP8.
Les nombres deviennent:
| binaire | décimal | hexadécimal | octal |
| 0111 1111 1111 1111 | +32767 | 7FFF | 077777 |
| ------------------- | |||
| 0000 0000 0000 0011 | +3 | 0003 | 000003 |
| 0000 0000 0000 0010 | +2 | 0002 | 000002 |
| 0000 0000 0000 0001 | +1 | 0001 | 000001 |
| 0000 0000 0000 0000 | 0 | 0000 | 000000 |
| 1111 1111 1111 1111 | -1 | FFFF | 777777 |
| 1111 1111 1111 1110 | -2 | FFFE | 777776 |
| 1111 1111 1111 1101 | -3 | FFFD | 777775 |
| ------------------- | |||
| 1000 0000 0000 0000 | -32768 | 8000 | 100000 |
-210 + 510:
1111 1111 1111 11102
+ 0000 0000 0000 01012
-------------------
0000 0000 0000 00112
Le témoin de retenue (Carry) est constaté mais n'est pas d'actualité avec les nombres signés.
Nous voulons effectuer l'opération mathématique suivante: 24010 - 36010 :
L'ordinateur modifiera le calcul par 240 + (-360):
24010 -> 0000 0000 1111 00002
36010 -> 0000 0001 0110 10002
Pour trouver le complément de 360, on se réfère au processus utilisé pour la base décimale:
1111 1111 1111 1111 + 1
- 0000 0001 0110 1000
-------------------
1111 1110 1001 0111 + 1 -> 1111 1110 1001 1000
Dans l'unité arithmétique et logique d'un ordinateur, l'opération
soustraction n'existe pas.
L'ordinateur utilise plutôt la méthode suivante:
a) inversion des bits: 360 -> 0000 0001 0110 1000 (appelé complément à 1)
1111 1110 1001 0111
b) + 1
-> 1111 1110 1001 1000 (appelé complément à 2)
Question si le contenu d'un mot mémoire de 16 bits est 1111 1111 0000 11112, quel est sa valeur en décimal ?
Si le nombre débute par un zéro, alors on peut directement trouver sa valeur
car il est positif.
Mais si le nombre débute par un 1, alors on doit trouver son complément car il
est négatif.
Comme le nombre 1111 1111 0000 1111 débute par un 1, on doit trouver son
complément:
Le complément de 1111 1111 0000 1111 :
a) inversion des bits: 0000
0000 1111 0000
b) + 1 -> 0000 0000 1111 0001 -> 128+64+32+16+1 -> 24110
Réponse: -241
BASE HEXADÉCIMALE
Page 37.
7FFF (+3276710)
....
0003
0002
0001
0000
FFFF
FFFE
....
8000 (-3276810)
On peut reconnaître facilement le signe d'un nombre hexadécimal en analysant
son premier bit (0-positif,1-négatif):
Ainsi A123 est négatif car A en binaire est représenté par
1010,
7222 est positif car 7 en binaire est représenté par
0111.
Nous voulons effectuer l'opération mathématique suivante: 10010- 12010:
L'ordinateur modifiera le calcul par 10010 + (-12010):
10010 -> 006416
12010 -> 007816
Pour trouver le complément de 007816, on se réfère au processus utilisé pour la base décimale:
FFFF + 1
- 0078
----
FF87 + 1 -> FF88
0064
+ FF88
----
FFEC
Question si le contenu d'un mot mémoire de 16 bits est FFAA16, quel est sa valeur en décimal ?
Si le nombre en binaire débute par un zéro, alors on peut directement trouver
sa valeur car il est positif.
Mais si le nombre en binaire débute par un 1, alors on doit trouver son
complément car il est négatif.
Comme le nombre en binaire débute par un 1 (F->1111),
on doit trouver son complément
Le complément de FFAA:
a) FFFF + 1
-FFAA
----
0055
b) + 1 -> 0056 -> 16*5+6 -> 8610
Réponse: -86
BASE OCTALE
Section non développée dans les notes de cours.
077777 (+3276710)
......
000003
000002
000001
000000
177777
177776
177775
......
100000 (-3276810)
On peut reconnaître facilement le signe d'un nombre octal en analysant son
premier bit (0-positif,1-négatif):
Ainsi 122222 est négatif car il
débute par 1,
072222 est positif car il débute
par 0.
En octal, le premier chiffre ne peut être que 0 ou 1.
Nous voulons effectuer l'opération mathématique suivante: 16010 - 20010:
L'ordinateur modifiera le calcul par 16010 + (-20010):
16010 -> 0002408
20010 -> 0003108
Pour trouver le complément de 00031010, on se réfère au processus utilisé pour la base décimale:
177777 + 1
- 000310
------
177467 + 1 -> 177470
000240
+ 177470
------
177730
Question si le contenu d'un mot mémoire de 8 bits est 1777668, quel est sa valeur en décimal ?
Si le nombre en binaire débute par un zéro, alors on peut directement trouver
sa valeur car il est positif.
Mais si le nombre en binaire débute par un 1, alors on doit trouver son
complément car il est négatif.
Comme le nombre en binaire débute par un 1, on doit trouver son complément
Le complément de 177766:
a) 177777 + 1
- 177766
------
000011
b) + 1 -> 000012 -> 8*1+2 -> 1010
Réponse: -10