Représentation des nombres

Nombres entiers

Représentation avec signe+valeur absolue

En représentation Signe+valeur absolue (SVA en abrégé) un nombre est représenté sur 4, 8 ou 16 bits ..., tel que le bit le plus à gauche désigne son signe et d'attribuer par convention le code 0 au signe (+), et la valeur 1 au signe (-). Les bits restants désignent la valeur absolue du nombre. Les nombres sont codés de la façon suivante : ± valeur absolue.

Exemple: Représenter en signe+valeur absolue sur un octet les entiers : +27 et-27.

Le nombre décimal 27 est égal à 11011=11011 en binaire pur sur 8(divisions successives). Alors:

+27 → SVA : 0 0 0 1 1 0 1 1

-27 → SVA : 1 0 0 1 1 0 1 1

Le fait de réserver un bit pour le signe réduit le nombre de valeurs à représenter. Un nombre en représentation binaire signée sur n bits appartient à l'intervalle [ ( 2 n 1 1 ) , + ( 2 n 1 1 ) ] [-(2^{n-1} -1), + (2^{n-1}-1)] .

Cette méthode présente deux inconvénients :

  • le chiffre 0 possède deux représentations : 1 000 pour (-0) et 0 000 pour (+0).

  • elle entraîne un traitement spécial du signe, et des circuits électroniques différents selon que l'on voudra réaliser des additions ou des soustractions.

Complément à 1 (complément restreint)

Le complément à 1 (C1 en abrégé) d'un entier binaire non signé s'obtient tout simplement en inversant les bits, i.e., 0 → 1 et 1 → 0. Dans la représentation en complément à 1 des entiers signés sur un mot de longueur bits, on garde la même convention pour le bit de signe ; les nombres positifs gardent le format binaire ; les nombres négatifs sont complétés.

Exemple: Représenter en complément à 1 sur un octet les entiers : +3, -3.

Le 3 décimal est tel que 3=(11)_2=(00000011)_2. Alors :

+3 → C1 : 0 0 0 0 0 0 1 1

-3 → C1 : 1 1 1 1 1 1 0 0

Si on travaille sur n bits, l'intervalle des valeurs qu'on peut représenter en C1 est [ ( 2 n 1 1 ) , + ( 2 n 1 1 ) ] [-(2^{n-1} -1), + (2^{n-1}-1)] . L'addition en complément à 1 se base sur le principe suivant :

  • Si aucune retenue n'est générée par le bit de signe, le résultat est correct, il est exprimé en complément à 1.

  • S'il y a une retenue qui est générée par le bit de signe, elle sera additionnée au résultat de l'opération, celui-ci est exprimé en complément à 1.

  • Lorsqu'on additionne deux nombres du même signe il y a un risque de dépassement de capacité (overflow). Cela arrive lorsque les deux nombres sont positifs et le bit du signe du résultat est 1 ou bien lorsque les deux nombres sont négatifs et le bit de signe du résultat est 0.

Exemples: calculons +5+2, -5-2, +5-2, -5+2 sur 4 bits en complément à 1.

Ainsi, toutes les opérations sont correctes.

Comme pour la méthode SVA, le zéro possède deux représentations distinctes. Par exemple sur 8 bits +0=00000000(C1) et -0=11111111(C1).

Complément à 2 (complément vrai)

Dans la représentation en complément à 2 (C2 en abrégé) des entiers signés sur un mot de longueur bits, on garde la même convention pour le bit de signe. Ainsi, les nombres positifs sont codés de la même façon qu'en signe + valeur absolue.

Pour coder les nombres négatifs en complément à 2 sur n bits, nous présentons deux méthodes :

  • Trouver d'abord le complément à 1 du nombre puis ajouter 1 au résultat.

  • Prenons la représentation binaire pur du nombre. Cette deuxième méthode consiste à conserver tous les bits à partir de la droite jusqu'au premier 1 compris et d'inverser les autres bits de 1 à 0 et de 0 à 1.

Exemples Calculons le complément à 2 de (-33) et (-42) sur 1 octet.

Le nombre décimal 33 est tel que 33=(100001)_2. Alors

-33 → C2 : 11011111.

Le nombre décimal 42 est tel que 42=(101010)_2. Alors

-42 → C2 : 11010110.

Cas spécial de la représentation en complément à 2:

En représentation en complément à deux le nombre 1 00...0 (avec n-1 zéros) ne représente rien, d'où l'idée de le considérer comme un entier négatif, dont l'équivalent décimal est – 2^{n-1} c'est-à-dire :

( 10. ..0 ) C 2 = 2 n 1 ( 10...0 )_{ C2} = -2^{n-1} .

Remarques:

  • Dans la représentation en complément à 2, le zéro possède une seule représentation.

  • En complément à 2 tout nombre possède son opposé et l'intervalle des nombres représentables sur n bits en complément à 2 est [ 2 n 1 , + ( 2 n 1 1 ) ] [ -2^{n-1}, +(2^{n-1}-1) ] .

Addition en complément à 2:

  • L'addition en complément à 2 se fait comme en binaire pur. Contrairement au complément à 1, on ignore la retenue.

  • Lorsqu'on additionne deux nombres du même signe il y a un risque de dépassement de capacité (overflow). Cela arrive lorsque les deux nombres sont positifs et le bit du signe du résultat est 1 ou bien lorsque les deux nombres sont négatifs et le bit de signe du résultat est 0.

Exemples: Effectuons les opérations suivantes en C2 sur 1 octet: +63-28

Le nombre décimal 68 est tel que 63=(00111111)_2. Alors

+63 → C2 : 00111111.

Le nombre décimal 28 est tel que 28=(00011100)_2. Alors

-28 → C2 : 11100100.

En faisant la somme et en ignorant la retenue on trouve 00100011, c'est le complément à 2 de +35.

Nombres fractionnaires

Représentation des nombres à virgule fixe

La représentation de la virgule qui sépare la partie entière de la partie décimale, dans un nombre fractionnaire (réel) pose un problème au niveau de la machine. La première solution adoptée était de ne pas représenter matériellement la virgule, et de traiter le nombre comme s'il était entier. On dira que la virgule est fictive (ou virtuelle), elle est gérée par le programmeur, c'est lui qui définit sa position au fur et à mesure des calculs, chose qui n'est pas évidente, d'où son inconvénient.

Exemple : On considère un nombre réel représenté sur 6 bits (en représentation binaire signée : signe + valeur absolue), tel que :

  • 1 bit pour le signe (0 pour positif, 1 pour négatif)

  • 3 bits pour la partie entière

  • 2 bits pour la partie décimale

Représentation des nombres à virgule flottante

Cette représentation des nombres réels est en fait une norme internationale qui est largement reconnue et utilisée par la majorité des constructeurs d'ordinateurs actuellement. Cette norme définie trois formats pour les

nombres flottants :

  • simple précision sur 32 bits

  • double précision sur 64 bits

  • précision étendue sur 80 bits

La représentation en virgule flottante consiste à représenter les nombres sous la forme suivante : N = ±M * b^E , avec b : base du système, M : mantisse, E : exposant. L'exposant est un entier, la mantisse un nombre purement fractionnaire. Celle-ci est normalisée, i.e. le premier chiffre à droite de la virgule est un 1.

Dans les trois présentations précédentes, l'ordre est fait comme suit : d'abord le signe, puis l'exposant ensuite la mantisse. Les exposants sont décalés d'une valeur de décalage de sorte à éviter d'avoir recours à la représentation en complément à 2 des exposants négatifs. Cet ordre a été adopté pour faciliter la comparaison entre les nombres réels. Étant donné que les mantisses sont normalisées (commencent toujours par un bit (fictif) à 1), la comparaison de deux nombres revient directement à comparer les exposants.

La norme IEEE 754 simple précision:

La norme IEEE 754 simple précision définit la façon de coder un nombre réel sur 32 bits, partagés comme suit :

  • le MSB est réservé pour le signe. Par convention le code 0 représente le signe (+) et le code 1 représente le signe (-).

  • l'exposant est codé sur les 8 bits consécutifs au signe. L'exposant pouvant aller de -126 à 127 (les valeurs -127 et 128 sont réservés pour des cas spéciaux). Le codage de l'exposant est biaisé, en lui ajoutant 127 qui est égal à 1111111 en binaire.

  • les 23 bits restants. On fait, on code sur 24 bits : comme le bit à gauche de la virgule est toujours 1, il est omis dans le codage.

Exemples:

  1. Ecrivons le nombre décimal 125 en format IEEE 754 simple précision. Nous avons : 125= ( 1111101)_2

    Bit de signe = 0

    Mantisse=0.1111101

    Exposant réel=7 d'où exposant décalé est 7+127=10000110.

    Alors 125 s'écrit en format IEEE 754 SP comme suit

    0 1 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    Pour abréger la notation, on peut grouper les bits 4 à 4 et les représenter par les digits hexadécimaux. Pour l'exemple précédent, on obtient ainsi : 437D0000.

  2. Convertir le nombre hexadécimal flottant IEEE format simple précision 42EA8000.

    0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    Bit de signe=0 d'où le nombre est positif.

    Exposant décalé ( 10000101)_2 = 133

    Exposant réel=133-127=6.

    Mantisse 0.11010101.

    Alors N=+53.25.

Les limites de cette présentation

Cas spéciaux : La norme IEEE 754 prévoit aussi des cas d'exception issus de calculs. En effet, quant on fait des calculs, on peut être amené à faire des divisions par zéro, à trouver des nombres approchant l'infini, etc. Par exemple dans la norme IEEE 754 simple précision, la valeur (mantisse=0 et exposant=255) indique que le nombre est infini. Par ailleurs la valeur 0 est représentée par une mantisse à 0 et un exposant à 0. Et enfin, quant l'exposant est nul alors que la mantisse est différente de zéro, cela indique que la représentation indiquée n'est pas un nombre (NAN).

NAN (not a number) : l'exposant = 255

±

11111111

Toute autre configuration sauf des 0

Zéro : l'exposant = 0

±

0

0

Infini, l'exposant = 255

±

11111111

0