Représentation des données/Entiers

Un livre de Wikilivres.
Représentation des données
Modifier le modèle

Nous allons dans cette partie présenter différentes manières de représenter les entiers signés ou non. Les deux codages à retenir dans cette partie sont le codage binaire non signé et le codage en complément à 2 qui sont ceux utilisés les plus couramment en informatique.

BCD[modifier | modifier le wikicode]

Le codage BCD (pour Binary Coded Decimal) code chaque chiffre d'un nombre en base 10 par un octet :

0 : 00000000 2 : 00000010 4 : 00000100 6 : 00000110 8 : 00001000
1 : 00000001 3 : 00000011 5 : 00000101 7 : 00000111 9 : 00001001

Le codage d'un entier est alors immédiat, il suffit de mettre bout à bout le codage de chaque chiffre du nombre. Par exemple le codage de 1978 est (00000001000010010000011100001000)2.

On peut remarquer que les quatre premiers bits de chaque octet sont toujours nul, on peut « compresser » le codage BCD en plaçant deux chiffres sur le même octet, le codage de 1978 devient alors : (0001100101111000)2.

Codage binaire non signé[modifier | modifier le wikicode]

Chaque bit représente une puissance de deux, plus précisement un bit en position i dans le nombre correspond à 2i.

valeur 27 26 25 24 23 22 21 20
position 7 6 5 4 3 2 1 0

Pour obtenir la valeur d'un entier, il suffit de faire la somme de ses puissances de deux, par exemple :

(00000101)2 = 0 * 27 + 0 * 26 + 0 * 25 + 0 * 24 + 0 * 23 + 1 * 22 + 0 * 21 + 1 * 20
= 22 + 20
= 4 + 1 = 5

L'opération contraire (trouver la représentation d'un entier en base 2) s'effectue ainsi :

  1. diviser le nombre par 2 ;
  2. noter le reste de la division (0 ou 1) ;
  3. recommencer l'opération avec le résultat de la division tant que le nombre n'est pas nul.

Par exemple pour convertir 13 :

  • 13 / 2 = 2 * 6 + 1, on note 1 et on continue avec 6 ;
  • 6 / 2 = 2 * 3 + 0, on note 0 et on continue avec 3 ;
  • 3 / 2 = 2 * 1 + 1, on note 1 et on continue avec 1 ;
  • 1 / 2 = 2 * 0 + 1, on note 1 et on s'arrête.

Les restes des divisions successives donnent alors les bits du codage de 13 en base 2 en commencant par la droite. 13 s'écrit donc (1101)2

Addition[modifier | modifier le wikicode]

L'addition de deux nombres s'effectue comme une addition « classique » avec les règles suivantes :

  • (0)2 + (0)2 = (0)2
  • (1)2 + (0)2 = (0)2 + (1)2 = (1)2
  • (1)2 + (1)2 = (10)2

La deuxième chose à prendre en compte est que les nombres sont limités à un certain nombre de bits et que des débordements peuvent se produire et que dans ce cas, les résultats ne seront pas corrects. Par exemple sur 8 bits : 129 + 127 = (10000001)2 + (01111111)2 = (00000000)2 = 0

Multiplication[modifier | modifier le wikicode]

Le cas le plus simple de multiplication est la multiplication par 2. En effet chaque bit correspondant à une puissance de 2, une multiplication par deux revient à décaler chaque bit d'un cran vers la gauche.

7 * 2 = (00000111)2 * 2
= (00001110)2 = 14

Dans le cas général, la multiplication de deux nombres consiste à faire la somme des décalages. Pour multiplier 3 par 5 sur 4 bits :

décalages de 3 bits de 5
0011 1
0110 0
1100 1
1000 0

On fait la somme des décalages de 3 pour lesquels les bits de 5 sont à 1, ce qui fait (0011)2 + (1100)2 = (1111)2 = 15.

Division[modifier | modifier le wikicode]

De même que multiplier par 2 revient à décaler les bits vers la gauche, diviser par 2 revient à décaler les bits vers la droite.

Codage binaire signé[modifier | modifier le wikicode]

Dans le cas des entiers signés, on utilise le bit de poids le plus fort comme bit de signe, si il vaut 0 l'entier est positif, sinon il est négatif.

Complément à 1[modifier | modifier le wikicode]

Complément à 2[modifier | modifier le wikicode]

La notation la plus courament utilisée pour les entiers signés est le complément à deux :

  • un entier positif est représenté « normalement » ;
  • un entier négatif est obtenu à partir de sa valeur absolue et en réalisant le complément à deux, chaque bit est inversé puis on ajoute 1 au résultat.

Par exemple pour représenter -56 sur 8 bits :

  • on cherche la représentation de 56 : 56 = 32 + 16 + 8 = (00111000)2 ;
  • on complémente (on inverse chaque bit) : (11000111)2 ;
  • et on ajoute 1 : (11001000)2.

Addition[modifier | modifier le wikicode]

La notation en complément à deux a l'énorme avantage d'être compatible avec l'opération d'addition telle que nous l'avons définie sur les entiers non signés, en effet essayons d'additionner 56 et -56 sur 8 bits :

56 + (-56) = (00111000)2 + (11001000)2
= (00000000)2 = 0

Les résultats obtenus peuvent néanmoins être surprenants, par exemple sur 8 bits :

50 + 90 = (00110010)2 + (01011010)2
= (10001100)2 = -116

Ce qu'il s'est produit est que les retenues du calcul ont débordé sur le bit de signe donnant ainsi un résultat négatif pour la somme de deux positifs.