# Représentation des données/Entiers

* Représentation des données
* Entiers
* Réels
* Caractères
* Ordre des octets
* 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

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é

Chaque bit représente une puissance de deux, plus précisement un bit en position i dans le nombre correspond à 2$^i$.
| valeur | 2$^7$ | 2$^6$ | 2$^5$ | 2$^4$ | 2$^3$ | 2$^2$ | 2$^1$ | 2$^0$ |
| 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 * 2$^7$ + 0 * 2$^6$ + 0 * 2$^5$ + 0 * 2$^4$ + 0 * 2$^3$ + 1 * 2$^2$ + 0 * 2$^1$ + 1 * 2$^0$ |
| | = | 2$^2$ + 2$^0$ |
| | = | 4 + 1 = 5 |
L'opération contraire (trouver la représentation d'un entier en base 2) s'effectue ainsi :
* diviser le nombre par 2 ;
* noter le reste de la division (0 ou 1) ;
* 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

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

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

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é

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 à 2

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

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.