> Pour comprendre le fonctionnement du binaire, nous allons nous intéresser dans le un premier temps à la représentation des entiers positifs en base 10. Quelque soit la base utilisée, le fonctionnement est identique et les méthodes de conversion sont similaires.
Cependant cette méthode possède un inconvénient majeur :
Les opérations "classiques" avec 2 nombres binaires ne fonctionnent plus ! C'est pour ces raisons que nous allons utiliser une nouvelle méthode : **le complément à deux**.
Par ailleurs, on peut observer qu'il existe dorénavant deux manières de notation du nombre zéro (0) :
- $`0000\ 0000 = +0`$
- $`1000\ 0000 = -0`$
## 2. Le complément à 2
Le **complément à 2** est la méthode de représentation d'un entier négatif.
Cette méthode se décompose en quatre (4) étapes :
1. Représenter la valeur absolue de l'entier relatif sur $`p`$ bits
2. Inverser tous les bits (les 1 deviennent des 0 et vice versa)
3. Ajouter un (1) au nombre obtenu à l'étape précédente
4. Le résultat de cette dernière opération est donc la représentation sur $`p`$ bits de l'entier relatif.
**Travail à faire**
> Calculer l'entier -5 en appliquant le complément à 2 sur 8 bits.
Vérifions que la représentation par le complément à 2 satisfait la règle vue précédemment.
Dans l'opération ci-dessus, nous avons un 1 pour le 9ième bit, mais comme notre représentation se limite à 8 bits, il nous reste bien $`(00000000)_2`$.
> 1. Représenter sur 8 bits l'entier 4 puis représenter, toujours sur 8 bits, l'entier -5.
> 2. Additionner ces 2 nombres, vérifier que vous obtenez bien -1.
**Question pour vous**
- Quel est le plus petit entier négatif que l'on peut représenter sur huit (8) bits ?
Plus généralement, nous pouvons dire que pour une représentation sur $`n`$ bits, il sera possible de coder des valeurs comprises entre $`-2^{n-1}`$ et $`+2^{n-1} - 1`$ .
Sachant que dans le langage C, les entiers signés sont codés sur 32 bits, dont un (1) pour le signe, quelles sont les valeurs minimale et maximale des entiers que l'on peut représenter ?
En Python, la taille des entiers est arbitraire (donc non fixe), ainsi les valeurs minimale et maximale des entiers ne dépend que de la quantité de mémoire disponible sur votre machine.
Néanmoins, on dispose de la bibliothèque _numpy_ qui permet de forcer une représentation sur 8 bits, par exemple, à l'aide de la fonction *int8*
<arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><imgalt="Licence Creative Commons"style="border-width:0"src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"/></a><br/>Ce cours est mis à disposition selon les termes de la <arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.