Informatique


Codage des nombres entiers

Aller à

Introduction

Les nombres entiers sont représentés sur des configurations strictes de 8 bits, 16 bits, 32bits ou 64 bits, les nombres négatifs sont représentés par le complément à 2.

  • Une repésentation sur 64 bits (8bytes) s'appelle un QWORD (quadruple word)
  • Une repésentation sur 32 bits (4 bytes)s'appelle un DWORD (dubble word)
  • Une repésentation sur 16 bits (2 bytes)s'appelle un WORD (word)
  • Une repésentation sur 8 bits (1 bytes)s'appelle un BYTE

Intuitivement

Les circuits électroniques digitaux ne peuvent enregistrer que des 0 ou des 1 mais pas de signes + ou -.

... et il s'agit là d'un solide problème! Comment donc représenter une valeur négative en mémoire?

Le seul moyen est de convenir que si un nombre est négatif on lui réserve un bit pour indiquer le signe.
Reste à déterminer le bit qui dans un nombre binaire conviendrait le mieux pour symboliser le signe et quelle valeur de ce bit (0 ou 1) conviendrait le mieux pour représenter le signe "plus" ou le signe "moins".

Observons d’abord le fait que les nombres codés en machine ont une dimension fixe :

  • Sur papier , les nombres ont des dimensions variables :
    L'addition de deux nombres de 2 chiffres donne un nombre de 2 ou 3 chiffres.
    La multiplication de deux nombres de 2 chiffres donne des nombres de 3 ou 4 chiffres.
  • En machine par contre, les nombres ne sont pas extensibles. Ils ont des dimensions fixes. C'est exactement ce que nous avons avec certain compteurs.

Exemple

Dans une voiture le compteur kilométrique s'il ne possède que 6 chiffres ne pourra pas indiquer plus que 999.999 km.
De même, dans les ordinateurs les nombres (binaires) ont aussi des dimensions fixes de 1, 2, 4 ou 8 bytes.

Revenons à l'exemple de la voiture et imaginez un compteur kilométrique qui compte les km en marche avant et qui les décompte en marche arrière.
Que pourrait-on lire sur un compteur d'une voiture neuve (compteur initialement à 000.000) si elle parcourt 1 km en marche arrière ?
Le compteur décompte 1 km et affiche donc ... 999.999 km !

Ce code correspond parfaitement à la valeur –1 puisqu'on obtient 0 si on lui ajoute à nouveau 1
Dans ce cas 999.999 équivaut à -1.
On exploite cette caractéristique étrange qui est due au fait que ce nombre à une dimension finie ( 6 chiffres décimaux)

De même, quel serait le code d'un nombre de 8 bits pour représenter la valeur –1 ?
Le code 1111 1111(2) = FF(16) convient puisque, si on ajoute 1 à ce nombre, on obtient 100000000(2), le bit de report déborde à gauche, il sort donc de l'espace qui est réservé au nombre et est donc ignoré!!
Donc nous aurons comme valeur 00000000(2)


Complément à 10 (1er méthode)

Pour appréhender plus facilement la technique du complément à 2 nous allons illustrer cette technique dans la base 10, le complément à 10.

Exemple 1:
Imaginons que nous ayons un nombre décimal représenté sur exactement 2 chiffres.
Comment représenter son négatif si nous ne disposons pas d'un signe?

42 - 24 = 18
Si pour la valeur (-24) nous prenons son complément à 10, nous pouvons écrire:
42 + (100 - 24) = 42 + 76 =118
Nous constatons que si nous retirons la valeur du complément, c'est-à-dire 100, nous obtenons 18.

la valeur 76 est donc le complément à 10 de 24, on pourrait l'utiliser comme valeur négative de 24 dans le cas d'une repérésentation décimale sur 2 chiffres.

Exemple 2:
Dans ce cas nous avons un nombre représenté par 3 chiffres, nous voulons pouvoir écrire une représentation de son négatif par un complément à 103. 420 - 209 = 211
Si pour la valeur (-209) nous prenons son complément à 1000 , nous pouvons écrire:
420 + (1000 - 209) = 420 + 791 =1211
Nous constatons que si nous retirons la valeur du complément, c'est-à-dire 1000, nous obtenons 211.

la valeur 791 est donc le complément à 10 de 209, on pourrait l'utiliser comme valeur négative de 209 dans le cas d'une repérésentation décimale sur 3 chiffres.

Autres exemples:
Représenter la valeur -45 en complément à 10: 100 - 45 = 55

Représenter la valeur -312 en complément à 10: 1000 - 312 = 688

Représenter la valeur -1691 en complément à 10: 10000 - 1691 = 8309


Complément à 10 (2ème méthode)

Plus intuitivement on peut constater la chose suivante:

En base 10 les zéros qui précèdent un nombre n'ont aucune influence sur la valeur de ce nombre.

123 ou 00123 ou 00000123 représentent la même valeur.

Dans le complément à 10 je pourrais représenter les négatifs avec un 9 en première position.

En effet, 99999 (pour une représentation sur exactement 5 chiffres représente la valeur -1 car 99999 + 1= (1)00000

Il s'agit bien là du complément à 10 de 9999.

Donc, si je veux représenter 00024 en négatif, je dois complémenter chaque chiffre à 9 et faire +1

9-0=9, 9-0=9, 9-0=9, 9-2=7, 9-4=5: j'ai donc 99975 auquel j'ajoute 1 : 99976

Vérification: 00042 + 99976 = (1)00018


Exemple 1

Supposons un intervalle de valeurs représenté sur 3 digits décimaux, représentons cet intervalle:

  • les valeurs négatives seront représentées par les valeurs 5XX, 6XX, 7XX, 8XX, 9XX
  • donc toutes les valeurs dont le premier chiffre est supérieur à 4 sont négatives
  • 2 méthodes pour calculer les négatifs:
    • 1000 - Nombre
    • complément à 9 sur 3 digits + 1

Représentons -24: 1000-24=976 ou (999-24)+1=976
Représentons -389: 1000-389=611 ou (999-389)+1=611
Représentons -500: 1000-500=500 ou (999-500)+1=500
Représentons -499: 1000-499=501 ou (999-499)+1=501
Représentons -2: 1000-2=998 ou (999-2)+1=998

Représentons -726: 1000-726=274 ou (999-726)+1=274 --> IMPOSSIBLE car le premier chiffre est 2 et ne repésente donc pas une valeur négative.
Représentons 726: IMPOSSIBLE car le premier chiffre est 7 et il devrait donc être négatif.

Exemple 2

Quelle est le signe et la valeur (ou magnitude) de 9990 si ce nombre est représenté sur 4 digits décimaux?

  • le premier chiffre de 9990 est supérieur à 4 donc le nombre est négatif
  • 10000-9990= 10 ou (9999-9990) + 1= 10

La valeur représentée par 9990 est -10


Exemple 3

Faisons deux petites additions simples:

  • -200 + 100 en complément à 10 sur 3 digits
  • -200 + 300 en complément à 10 sur 3 digits


Complément à 2

Supposons des nombres en base 2 représentés sur 8 bits, nous nous proposons de représenter les nombres entiers négatifs au moyen du complément à 28.

base 10 base 2  
+ 45 00101101  
- 45 Complément à 28 = 11010011
Vérification: 1 0000 0000 - 00101101 font bien 11010011


Pour trouver le complément à 2 d'un nombre binaire

Exemple: soit le nombre binaire représenté sur 8 bits: 00101101

  • Complément à 1 (NON logique), cela correspond à inverser tous les bits: 11010010
  • On ajoute 1: 11010010


Le truc de la mort qui tue

Pour les plus paresseux d'entre vous on peut utiliser le truc suivant:

Exemple:
Soit le nombre binaire représenté sur 8 bits: 00010100 (2010)
On applique la recette: 11101100 (-2010)


Conventions du complément à 2

Intervalle représenté pour une configuration de 8bits

La définition de l'intervalle est respectée: -2n-1 est bien égale à -128 et 2n-1 - 1 est bien égale à 127.
n représente le nombre de bits de la configuration.

Le complément à 2 du complément à 2

Lorsque l'on fait le complément à 2 du complément à 2 on retrouve la valeur de départ.

Prenons la valeur (01011110)2 ou (94)10

Prenons le complément à 2 de (01011110)2: (100000000)2 - (01011110)2 = (10100010)2

Prenons le complément à 2 de (10100010)2: (100000000)2 - (10100010)2 = (01011110)2

Nous avons bien retrouvé la valeur de départ !

L'addition d'une valeur et de son complément à 2

L'addition d'une valeur et de son complément à 2 vaut 0, ... c'est assez logique puisqu'on additionne un nombre avec son négatif.

Reprenons l'exemple précédent:

(01011110)2 + (10100010)2 = (1000000000)2

(le 1 en première position est exclu car il dépasse le nombre de bits de la configuration (overflow).

CQFD !

De l'importance de la taille du mot mémoire (QWORD, DWORD, WORD, BYTE)

Une petite anecdote à 500 millions:

Le 4 juin 1996, une fusée Ariane 5 a explosé 40 secondes après l'allumage. La fusée et son chargement avaient coûté 500 millions de dollars. La commission d'enquête a rendu son rapport au bout de deux semaines. Il s'agissait d'une erreur de programmation dans le système inertiel de référence.
À un moment donné, un nombre codé en virgule flottante sur 64 bits (qui représentait la vitesse horizontale de la fusée par rapport à la plate-forme de tir) était converti en un entier sur 16 bits. Malheureusement, le nombre en question était plus grand que 32768, le plus grand entier que l'on peut coder sur 16 bits (WORD), et la conversion a été incorrecte.
Plouf, 500 millions dans l'Atlantique...