Guide explicatif sur le chapitre 4 des notes de cours de
GABRINI, Ph. -- Organisation des ordinateurs et assembleur.

Chapitre 4. Introduction à l’arithmétique sur ordinateur

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 -> 86
10

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 (-32768
10)

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 -> 10
10

Réponse: -10