Soustracteur#
De l'addition à la soustraction#
Nous savons maintenant additionner avec un circuit. Pour soustraire, on pourrait inventer un tout nouveau circuit, avec des "emprunts" à la place des retenues. Mais il existe une idée bien plus économique : transformer la soustraction en addition. En effet, soustraire, c'est ajouter l'opposé :
Il suffit donc de savoir représenter -b en binaire. C'est exactement ce que
permet le complément à deux, que vous avez rencontré en 1ère année.
Le complément à deux#
Sur n bits, le complément à deux code un nombre négatif -b par la valeur
\(2^n - b\). En pratique, on n'a pas besoin de faire cette soustraction : on obtient
-b en deux gestes simples :
inverser tous les bits de
b(remplacer chaque0par1et inversement) : c'est le rôle de la porte NON, et on le note¬b;ajouter
1au résultat.
Prenons b = 3, soit 0011 sur 4 bits :
b = 0011 (3)
¬b = 1100 (on inverse chaque bit)
¬b + 1 = 1101 (on ajoute 1) -> -3
Le motif 1101 représente donc -3. On peut le vérifier : ajouté à 0011 (3),
il doit donner 0 (sur 4 bits). Et c'est bien le cas, 0011 + 1101 = 10000, dont
seuls les 4 bits de droite comptent : 0000.
Important
Pour obtenir -b en complément à deux : on inverse tous les bits de b
(¬b), puis on ajoute 1.
Note
Sur n bits, le complément à deux représente les entiers de \(-2^{n-1}\) à
\(2^{n-1} - 1\). Sur 4 bits, cela va donc de 1000 (\(-8\)) à 0111 (\(+7\)) ; sur
8 bits, de \(-128\) à \(+127\). L'intervalle est asymétrique : il y a toujours un
négatif de plus que de positifs, car le motif 0…0 occupe une des places
positives.
Soustraire, c'est additionner#
En remplaçant -b par ¬b + 1 dans notre égalité de départ, on obtient la
formule clé du soustracteur :
Autrement dit, pour calculer a - b, il suffit de reprendre le même
additionneur que dans le chapitre précédent, et de lui fournir :
atel quel ;¬b, c'est-à-dire chaque bit debinversé par une porte NON ;une retenue entrante
Cinégale à1, qui réalise le+ 1.
Voici par exemple 7 - 2 posé de cette façon :
retenues 1 1 1
0 1 1 1 ( a = 7 )
+ 1 1 0 1 ( ¬b, avec b = 2 )
+ 1 ( Cin = 1 )
-------
(1) 0 1 0 1 ( résultat : 5 )
Le résultat sur 4 bits est 0101, soit 5 : on a bien 7 - 2 = 5. La retenue
sortante (1) déborde et n'est pas conservée.
Le circuit#
Il ne reste plus qu'à câbler cette idée. On reprend la chaîne d'additionneurs
complets du chapitre précédent, on inverse chaque bit de b avec une porte
NON, et on fixe la première retenue entrante à 1.
Un soustracteur 4 bits : les additionneurs complets sont inchangés, seuls ¬b et
Cin = 1 diffèrent de l'additionneur.#
Le circuit est donc presque identique à l'additionneur : les additionneurs
complets ne changent pas du tout, on ajoute simplement quatre portes NON et on
force Cin = 1.
Astuce
La retenue sortante Cout renseigne sur le signe du résultat (en non signé) :
elle vaut 1 quand a ≥ b (le résultat est positif, il n'y a pas eu d'emprunt)
et 0 quand a < b (le résultat est négatif, écrit en complément à deux).
Un circuit qui additionne et soustrait#
On peut aller un cran plus loin. Remarquons qu'une porte XOR se comporte comme un
inverseur commandé : b ⊕ 0 = b (on ne change rien) mais b ⊕ 1 = ¬b (on
inverse). En remplaçant les portes NON par des portes XOR pilotées par un même
signal de commande M, et en reliant aussi M à la retenue entrante, on obtient
un circuit qui additionne quand M = 0 et soustrait quand M = 1.
Voyons d'abord cet inverseur commandé isolément. Dans la démonstration ci-dessous,
cliquez sur M : quand M = 0, la sortie recopie b ; quand M = 1, elle
l'inverse.
L'additionneur-soustracteur : le signal M inverse b (via les XOR) et fixe la
retenue entrante. M = 0 additionne, M = 1 soustrait.#
Quand M = 0, chaque XOR laisse passer b inchangé et Cin = 0 : le circuit
additionne. Quand M = 1, chaque XOR inverse b en ¬b et Cin = 1 : on
retrouve exactement le soustracteur a + ¬b + 1. C'est précisément la brique
dont nous aurons besoin pour construire l'unité de calcul du processeur.
Exercices#
Exercice 22#
Donnez le complément à deux sur 6 bits, c'est-à-dire la représentation de
-b, pour chacune des valeurs suivantes. Détaillez les deux étapes (¬b puis
+ 1).
b = 20b = 13b = 25b = 32
Solution
20 = 010100,¬b = 101011, puis101011 + 1 = 101100: c'est-20.13 = 001101,¬b = 110010, puis110010 + 1 = 110011: c'est-13.25 = 011001,¬b = 100110, puis100110 + 1 = 100111: c'est-25.32 = 100000,¬b = 011111, puis011111 + 1 = 100000: c'est-32. Sur 6 bits,-32est la plus petite valeur représentable, et son motif est son propre complément à deux.
Exercice 23#
Effectuez les soustractions suivantes sur 4 bits, en passant par l'addition
a + ¬b + 1. Donnez le résultat en binaire, puis en décimal.
7 - 44 - 75 - 5
Solution
0111 + 1011 + 1 = 10011, soit0011sur 4 bits :3. La retenue sortante vaut1(résultat positif).0100 + 1000 + 1 = 1101, soit1101: c'est-3en complément à deux. La retenue sortante vaut0(résultat négatif).0101 + 1010 + 1 = 10000, soit0000:0, comme attendu.
Exercice 24#
On applique a = 6 (0110) et b = 2 (0010) au soustracteur.
Quelles valeurs arrivent réellement sur les entrées des additionneurs, après les portes NON ? Que vaut la retenue entrante ?
Donnez la sortie
s(en binaire et en décimal) ainsi que la retenue sortanteCout, et interprétez cette dernière.
Solution
Les portes NON transforment
b = 0010en¬b = 1101. La retenue entrante vautCin = 1.0110 + 1101 + 1 = 10100, soit0100sur 4 bits :s = 4. On a bien6 - 2 = 4. La retenue sortante vautCout = 1, ce qui confirme quea ≥ bet que le résultat est positif.
Exercice 25#
Dans le simulateur ci-dessous, transformez un additionneur 4 bits en
soustracteur a - b. Les quatre « Additionneur complet » sont déjà en ligne
(comme sur le schéma), avec a et b au-dessus et s en dessous. Rappel :
a - b = a + ¬b + 1. Ajoutez donc une porte NON sur chaque b, reliez a
directement à son additionneur, et forcez la première retenue entrante (à droite,
celle de a0) à 1 avec une entrée réglée sur 1. Chaînez ensuite les
retenues et reliez les sorties. Testez sur 6 - 3, 4 - 7 et 5 - 5 : le
résultat est en complément à deux.