Information, Calcul, Communication Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne fait partie de son cours d’introduction à l’information, à la communication, et au calcul. Il s’inscrit dans le 1er module du cours qui offre une 1e approche des notions de calcul et d’information. Information, Calcul, Communication 1. Information & Calcul – Leçon 4: Représentation de l’Information Clip 3: Entiers Négatifs J-C. Chappelier, R. Boulic, commentaire: P. Janson
Plan de la leçon 1. Codage de l’information en binaire Unité élémentaire d'information Bits et bytes (octets) 2. Nombres entiers Représentation positionnelle Grandeur et limites 3. Nombres négatifs Représentation et traitement 4. Nombres rationnels à virgule fixe Représentation et erreurs => notation scientifique 5. Nombres rationnels à virgule flottante Représentation et approximation => précision 6. Représentation d’informations non-numériques Le 3e videoclip de cette leçon sur la représentation de l’information va porter l’attention sur la représentation des entiers négatifs.
Représentation par signe et valeur absolue: problème! Idée triviale: utiliser un bit pour spécifier le signe d’un entier Par exemple: 0 pour + 1 pour – bit de signe 27 26 25 24 23 21 20 Avantage: simplicité et symétrie apparente du domaine couvert … mais Problème: que représentent 00000000 et 10000000 ? +0 ? –0 ? => 2 représentations de zéro ! => Conséquences: X + (-X) ≠ 0 et donc X – Y ≠ X + (-Y) 1 La première idée qui vient à l’esprit serait naturellement de consacrer 1 bit au signe des entiers pour distinguer les positifs des négatifs. 2 L’avantage de cette convention est son évidente simplicité et la symétrie apparente du domaine couvert par un octet par exemple, de -27+1 à +27-1 … MAIS 3 Cette même symétrie pose un gros problème car elle n’existe pas : Que sont en effet supposés représenter les motifs 00000000 et 10000000 ? 4 +0 et -0 ? On aurait alors 2 représentations de 0 ? 5 Mais le plus grave est que dans ce cas l’arithmétique ne collerait plus du tout: X + (-X) ne donnerait pas 0 et X – Y serait différent de X + (-Y) !
Meilleure idée: changer une limitation en un atout Exploiter la capacité limitée de n bits pour obtenir une représentation des entiers négatifs telle que X – Y = X + (-Y) Rappel: n bits permettent de représenter 2n entiers naturels de 0 à 2n-1 La valeur 2n elle-même n’est pas représentable sur n bits En théorie: (2n-1) + 1 = 2n Mais sur n bits: (2n-1) + 1 = 0 (parce que la retenue est perdue) => Idée: utiliser le motif binaire de (2n-1) comme représentation de -1 => 1 + (-1) = 0 ! 1 Une meilleure convention consiste à exploiter la capacité limitée de n bits pour obtenir une représentation des entiers négatifs telle que X – Y soit bien égal X + (-Y) et donc X – X bien égal à 0. Nous verrons que la représentation qui en découle préserve le bit de signe mais sacrifie la symétrie des domaines couverts positif et négatif. 2 Pour rappel n bits permettent de représenter 2n entiers naturels de 0 à 2n-1. 3 Avec ces n bits, la valeur 2n elle-même n’est PAS représentable. En théorie (2n-1) + 1 = 2n mais sur n bits (2n-1) + 1 = 0 parce que la retenue est perdue. 4 L’idée est de convenir que le motif binaire de 2n-1, c.à.d. tous des 1, représente -1. 5 Avec cette convention on voit tout de suite que 1 + (-1) est bien = 0 !
Représentation des entiers négatifs par complément à 2 Mais alors comment représenter les nombres négatifs en général ? Objectif si a et b sont deux nombres opposés a + b = 0 et -(-a ) = a => On convient que l’opposé d’un nombre X est donné par l’expression 2n-X => Sur n bits: a + b = (2n–b) + b = 2n = 0 et -(-a ) = 2n-(2n-a) = a C’est ce qu’on appelle la représentation des nombres négatifs par complément à 2 Voir le vidéoclip du Prof. Boulic http://wandida.com/fr/archives/831 1 La question est de décider comment représenter les autres nombres négatifs. 2 L’objectif est bien entendu une représentation telle que si a et b sont deux nombres opposés, a + b = 0 et -(-a) = a 3 Et pour y arriver on convient de représenter un X négatif par le motif binaire de 2n-X. On voit tout de suite que cette convention respecte l’idée précédente de représenter -1 par 2n-1. On voit aussi que dans ce cas a + b est bien = (2n–b) + b qui est = 2n soit bien = 0 sur n bits et de la même façon -(-a) = 2n-(2n-a) qui est bien = a. 4 Cette façon standard de représenter les nombres négatifs s’appelle la représentation par complément à 2. 5 Un videoclip du Prof. Boulic offre une explication animée de cette convention.
Calcul de (2n-X) = complément à 2 de X Une simple petite transformation est nécessaire pour faire apparaitre des quantités représentables sur n bits les manipuler à l’aide d’opérations simples 2n–X = 2n – 1 + 1 – X = ((2n – 1) – X) + 1 Et ((2n – 1) – X) est trivial à obtenir Il suffit d’inverser chaque bit de X ! Cette valeur est appelée le complément à 1 de X => Complément à 2 de X = complément à 1 de X + 1 Représenter un nombre X négatif par le motif binaire de 2n–X est utile mais la question est de savoir comment dériver simplement ce motif de celui de X. 1 Comprendre ceci demande une petite pirouette arithmétique préalable pour faire apparaitre des quantités représentables sur n bits et manipulables par des opérations simples. 2 La pirouette consiste à réécrire 2n–X comme 2n – 1 + 1 – X … 3 … puis à réordonner ces termes sous la forme ((2n – 1) – X) + 1, où l’expression (2n – 1) correspond au motif binaire «tous des 1». 4 L’intérêt de l’expression ((2n – 1) – X) est que son motif binaire est trivial à exprimer:… 5 … il suffit d’inverser chaque bit de X, comme nous le verrons tout de suite dans un exemple. 6 Cette simple inversion s’appelle le complément à 1 de X 7 En d’autres termes, le complément à 2 de X se calcule simplement en ajoutant 1 au complément à 1 de X. 1
Vérification des propriétés du complément à 1 – Exemple 1110 (en complément à 1 sur 1 octet) = (28 – 1) – 1110 ? Motif binaire de 1110 Motif binaire de 28 – 1 Soustraction de 1110 – = complément à 1 de 1110 = 128+64+32+16+4 = 244 = 255 – 11 = (28 – 1) – 11 1 Vérifions par un exemple sur un octet que le complément à 1 de 1110 est bien = (28 – 1) – 1110. 1 Le motif binaire de 1110 est 1011 précédé de 4 zéros. 2 Le motif binaire de 28 – 1 est 11111111. 3 Si on soustrait de cela bit à bit le motif binaire de 1110 … 4 … on obtient le motif binaire 11110100 … 5 … qui est bien le complément à 1 de 1110 6 Maintenant si on calcule la valeur de ce motif, elle est = 128+64+32+16+4 soit 244 7 Mais 244 = 255 – 11 8 Soit encore (28 – 1) – 11, ce qui est bien la valeur de l’expression du complément à 1 de 1110. 1 1 1
Vérification des propriétés du complément à 2 – Exemple 1110 – 1110 (en complément à 2) = 1110 – 1110 (en complément à 1) + 1 = 0 ? Motif binaire de 1110 Complément à 1 de 1110 Addition de 1 Complément à 2 de 1110 = –1110 Addition de 1110 Retenues x = 0 Voir le vidéoclip du Prof. Boulic http://wandida.com/fr/archives/829 1 Vérifions ensuite que 1110 – 1110 (exprimé en complément à 2) est bien = 1 + 1110 – 1110 (exprimé en complément à 1) qui est à son tour bien égal au motif composé de 8 zéros qui exprime le nombre 0. 1 Le motif binaire de 1110 est 1011 précédé de 4 zéros. 2 Le complément à 1 de 1110 est donc 0100 précédé de 4 uns. 3 Si on ajoute à cela bit à bit le motif binaire de 1 … 4 … on obtient ce qu’on a appelé le complément à 2 de 1110 qui représente donc –1110. 5 Si on lui ajoute ensuite bit à bit le motif binaire de 1110 … 6 … on voit bien que chaque addition cause une retenue … 7 … et que si on ignore la dernière retenue qui tombe en dehors de l’octet on retrouve bien le motif binaire de 0. 8 Un autre videoclip du Prof. Boulic offre une fois de plus une explication animée de cette logique. 1 1 1 1 1
Domaine couvert et overflow Bit de poids n-1 = signe Maximum positif = 01111…1111 = 2n-1 – 1 Minimum positif = 00000…0000 = 0 Minimum négatif = 11111…1111 = –1 Maximum négatif = 10000…0000 = –2n-1 Dépassement de capacité => aucun problème entier positif + entier négatif < 0 => aucune retenue => entier négatif correct entier positif + entier négatif > 0 => retenue ignorée => entier négatif correct Overflow => changement de signe incorrect quand entier positif + entier positif > maximum positif entier négatif + entier négatif < maximum négatif Avant de clôturer ce sujet, revenons au bit de signe et à la rupture de symétrie annoncée plus haut. 1 Avec la représentation des entiers négatifs par complément à 2 on voit en effet que le ne bit (de poids n-1) indique de fait toujours le signe. 2 Par contre le plus grand entier positif exprimable avec cette convention est représenté par le motif 0 suivi de tous des 1, soit 2n-1 – 1, … 3 … le plus petit entier naturel est bien entendu 0, … 4 … l’entier le moins négatif exprimable avec cette convention est représenté par tous des 1 et vaut -110, … 5 … mais l’entier le plus négatif exprimable avec cette convention est représenté par le motif 1 suivi de tous des 0, soit 2n-1. On voit donc que la symétrie est rompue entre positifs et négatifs puisque les valeurs absolues des plus grands entiers positif et négatif exprimables par cette convention diffèrent de 1. Sur un octet le plus grand entier positif exprimable est 127, alors que l’entier le plus négatif exprimable est -128. 6 Ceci est peut-être plus clair sous forme graphique, où l’on voit bien que le 0, qui n’est en théorie ni positif ni négatif, occupe en pratique une des 128 valeurs de nombres positifs exprimables, alors que tous les nombres négatifs exprimables sont vraiment négatifs. 7 Le problème de dépassement de capacité «vers le bas» a donc disparu. Si on additionne un nombre négatif à un nombre positif on est assuré que le résultat tombera dans le domaine couvert. 8 Par contre si on ajoute deux grands nombres positifs ou négatifs, il reste toujours un risque de dépassement de capacité ou overflow en anglais: le résultat peut tomber en dehors du domaine couvert, ce qui en pratique fausserait totalement le bit de signe.
Domaine couvert et overflow – Exemple avec 3 bits Bit de signe Sur seulement 3 bits mais à plus grande échelle graphique, la situation asymétrique et le problème d’overflow sont plus clairement visibles.