Programmer une soustraction

Bonjour,

Prof de maths à plein temps et un peu codeur à mes heures perdues, je m’interroge (pas que moi …) sur l’opération qu’est la soustraction.
Ayant eu un petit débat cette après-midi avec une collègue ; je lui ai soutenu que la soustraction n’est pas une “vraie” opération, mais que la seule qui vaille est en fait l’addition.

Pour faire une soustraction de deux décimaux en la posant, on est ramené à faire des petites soustractions sur des nombres dont la distance ne dépasse pas la dizaine… et ces soustractions, on les fait en général en comptant sur ses doigts, c’est à dire en faisant des additions. (comme la bonne vieille méthode pour rendre la monnaie des commerçants (sans caisse automatique)… on fait pas une soustraction, mais des additions ; la soustraction n’étant la que pour écrire le résultat sous une forme non calculée)

Bref…

Lorsqu’on code, par ex en javascript, l’opération soustraction est déjà précompilée par le moteur, on peut l’utiliser telle quelle.
Je voulais savoir justement comment elle a été codée, c’est à dire comment, pour par exemple effectuer 7 - 4 un ordinateur fait-il ?

Une idée me vient à l’esprit, c’est de faire une boucle While en partant de 4, incrémentant de 1 à chaque tour et s’arrêter lorsque le résultat est égal à 7.
On compte le nombre de tours, et on obtient la différence voulue.

Cela doit être un peu plus compliqué que ça …
Si quelqu’un avait de la doc dessus !:miam:

Heu, pour ça, l’ordinateur fait ça (en gros):

store 7
store 4
substract

Pour l’assembleur, je l’ai les connaisseurs répondre. Mais pour le fond, le PC ne fait que convertir 7 et 4 en binaire, et faire la soustraction en binaire bit à bit. Tu peux aussi dire que la soustraction n’est que l’addition d’un nombre entier a et d’un nombre négatif b.

tout code est compilé pour être compris par le processeur dans un langage appelé assembleur : www.commentcamarche.net…

pas mal d’instructions sont dispos (du code très proche de ce que comprend le processeur : benoit-m.developpez.com…

a partir de ca, l’instruction de soustraction se fait comme telle : SUB Destination, Sourc
avec destination et source 2 registres ( emplacement mémoire)

Oui et en naviguant de lien en liens proposés par Jiheme44, l’addition c’est un XOR.
Donc au niveau informatique, tout n’est bien qu’additions.
Edité le 30/03/2009 à 21:57

Nope. La multiplication et sa cousine la division ne sont pas comme ça de mémoire :slight_smile:

Je me suis mal exprimé.
La soustraction n’est au niveau informatique qu’une addition.

Je ne considérais pas dans mon esprit ces deux autres opérations…
Pour la multiplication et la division c’est un autre problème :nexath
Edité le 30/03/2009 à 22:12

J’ai grave grave grave séché sur tout ce qui était langage machine à l’époque mais…

Du point de vue mathématique, on m’a toujours dit qu’il n’y avait réellement que 2 types d’opérations, l’addition et la multiplication. soustraire, c’est additionner l’opposé, diviser, c’est multiplier par l’inverse.

Des bribes que j’ai retenu du langage machine, ça fonctionne pareil : l’addition/soustraction est une opération d’addition de bits, la multiplication/division est un décalage de bits.

Et il n’y a pas besoin de faire du code compliqué, le système gère ça très bien au niveau des registres.

Euh, au niveau machine, et sauf erreur de ma part, il n’existe pas d’opération arithmétique. Ces dernières sont en fait des successions d’opérations logiques (ET, OU, NON).

Donc que ce soit pour faire 1+1 ou 1-1, il faut se dire que les opérandes sont des représentations binaires de la donnée, et que sur celles-ci s’appliquent une certaine quantité d’opérations logiques.

Et OU Exclusif (XOR). Mais oui, de toute façon ce n’est que ça les opérations bit à bit :slight_smile: ça et les décalages :slight_smile:
Edité le 31/03/2009 à 11:59

Oui c’est certain que tout passe par des opérations logiques.
Mais ce qui est important c’est que pour additionner ou soustraire, on utilise la même opération logique.

Alors le XOR et le XAND résultent également de OR / AND me semble t il.

Perso je dirais les memes opérations logiques, car je suis à peu près certain que pour une addition ou une soustraction, les opérations utilisées ne seront pas les memes car à ce niveau, il est très important de ne faire que le strict nécessaire.

Evidemment, on pourrait dire que comme a - b = a + (-b), eh bien on peut limiter d’autant plus le jeu d’instruction assembleur. Mais les contraintes de performance sont prioritaires.

A vérifier.

Il y a des ensembles d’opérations numériques de base avec lesquelles ont peut faire toutes les opérations.
Par exemple, avec un NAND … on peut faire toute les opérations numérique (opération numérique : AND, OR … pas d’addition ou soustraction).
Les processeurs utilisent un ensemble de ses opérations de bases (avec des XORs on peut tout faire, mais bon si on cherche a optimiser …).
L’architecture inter des processeur va dépendre du processeur (je pense) …

Pour la question : est ce que la soustraction est interprétée par une addition sur un ordinateur, la réponse est oui.
Mais seulement sur l’architecture de nos ordinateur (l’architecture d’une calculatrice scientifique peut etre différent).
La raison est que les ordinateurs de nos jours utilisent le complément à 2 pour “coder” les nombres.

sur 3 bits, le 2 est représenté par 010.
Complément à 2, on inverse tous les bits, et on ajoute 1 :
101 + 001 = 110
Donc en complément à 2 (et sur 3 bits), -2 est représenté par 110.
Faisons 2 + (-2) => 010 + 110 = 1000 mais comme on est sur 3 bits, le premier 1 disparait et donc => 000
On obtient 2 + (-2) = 0

Donc oui la soustraction est une addition mais l’ordi "convertit d’abord le nombre négatif.
Les raisons pour lesquelles les ordi utilisent le complément à 2 sont :

  • L’addition et la soustraction fonctionnement sur les mêmes circuits électroniques.
  • Avec le complément à 2, il existe un unique zero

Pour justifier l’unique zero, voici l’exemple d’un autre calculateur :
Nombre sur 3 bits, avec le premier bit donnant le signe (1 pour négatif).
(dans ceux cas, le calculateur à des circuits pour additionner et soustraire, donc il lui faut le “double” de circuits, mais c’est légèrement plus rapide !).
Cependant on remarque que 100 et 000 représentent tous les deux le zero … et cela peut poser problème si c’est pas bien gérer.

Bon j’éspère que mes explication sont claires et que je répond au sujet.
Edité le 31/03/2009 à 14:54

Qu’est-ce qu’un XAND?

C’est rien, j’ai fumé trop de moquette :slight_smile:
C’est parce que dans mes souvenirs, j’avais l’image de ce ?AND et ?OR avec un flou sur le ?
Donc j’ai déduis un peu trop vite … désolé ! Jpense que c’était plutot à propos de NOR et NAND … enfin bref !

J’ai encore réfléchi sur le sujet, et je doute un peu …

Pour les entiers, je maintien ce que j’ai dit ( le signed int va de -128 à 127 … un seul zero …)
Cependant pour les floats, c’est tout a fait différent.

Pour un float sur 32 bits : le 1er bit (je crois) représente le signe, les 8 suivants l’exposant, et les 23 derniers, la mantisse.
Je crois qu’il s’agit de la norme IEE 754 (je suis pas sur du numéro, et pas sur que c’est celle utilisée sur les ordis).
Après, je sais pas du tout comment l’opération est effectuée.
Mais il est toujours possible, qu’après avoir décalé les bits (multiplication par 2 puissance exposant), le processeur procède à nouveau à un complément à 2 pour effectuer la soustraction par une addition.
C’est à vérifier …
Edité le 31/03/2009 à 22:25