# Complément à 2
Comment représenter les nombres entiers négatifs dans un ordinateur ?
> Quand j'écris `[1110 1001]` il faut comprendre qu'il s'agit d'un octer tel qu'il est écrit dans la mémoire, sans aucune signification particulière.
En particulier, `[1110 1001]` ne doit pas être confondu avec le nombre binaire `0b1110 1001`.
---
## Problèmatique
On ne dispose que de `0` et de `1`, comment représenter le moins ?
---
## Première idée : bit de signe
> idée valable, mais pas retenue !
On pourrait **décider** que le premier bit représenterait le signe. `1` pour **moins** et `0` pour **plus**.
* Ainsi `[1110 1001]` représenterait $-110\space 1001_b = -105$.
* Ainsi `[0110 1001]` représenterait $+110\space 1001_b = +105$.
---
## Pourquoi n'utilise-t-on pas le bit de signe ?
On considère un µProc. On veut pouvoir choisir le mode de calcul :
* soit un mode **non signé** où il n'y a **que** des positifs. Pas besoin de s'embarrasser du problème des négatifs.
* soit un mode **signé** où il y a des négatifs. Il faut pouvoir gérer la présence du moins.
---
### Exercice
On considère un microprocesseur où les nombres sont codés sur un octet.
On a les nombres A et B et on veut calculer S = A + B.
* 1er cas, A = $131$ et B = $7$. Mode non signé. Cas normal.
Donner la représentation en mémoire de A, B et S.
* 2e cas, A = $-3$, B = $7$. Mode signé. Même question.
* Quel est le problème ?
---
### problème
On voit que :
* En mode signé,
`[1000 0011] + [0000 0111] = [1000 1010]`
* En mode non signé,
`[1000 0011] + [0000 0111] = [0000 0100]`
Le circuit **add** est donc différent !
---
## Le complément à 2 — CA2
Ma voiture a 453 725 km au compteur. Le compteur affiche 6 chiffres.
Je veux ramener le compteur à 000 000 km mais sans trafiquer le compteur, seulement en roulant. Est-ce possible ? Comment ?
---
### solution
On va jusqu'à 999 999 km plus 1.
`[453 725]` → « inv » `[546 274]` → +1 : `[546 275]`.
`[453 725] + [546 275] = [000 000]`
On peut donc dire `[546 275] = - [453 725]`
---
### même principe en binaire
Partant d'un nombre, par ex. `[1101 0101]`
* inverse : `[0010 1010]`
* +1 : `[0010 1011]`
On peut constater que
`[1101 0101] + [0010 1011] = [0000 0000]`
---
### Coder den CA2
Soit `n` un nombre à coder,
* si `n >= 0`, on le code en binaire naturel ;
* si `n < 0` on code `-n` en binaire naturel ; on fait **inverse** puis +1
> coder en CA2 : $52$ ; $-31$ ; $117$ ; $-91$ ; $189$
---
### Décoder du CA2
* Si le nombre commence par `0`, il est positif, c'est du binaire naturel.
* S'il commence par `1`, faire inverse puis +1 ; décoder ce nombre ; mettre — devant.
> décoder
>
> `[0000 0000]` ; `[0001 1011]` ; `[1010 1100]` ; `[1111 1111]` ; `[0111 1111]` ; `[1000 0000]`
---
### Mieux que bit de signe
On considère un microprocesseur où les nombres sont codés sur un octet.
On a les nombres A et B et on veut calculer S = A + B.
* 1er cas, A = $131$ et B = $7$. Mode non signé. Cas normal.
Donner la représentation en mémoire de A, B et S.
* 2e cas, A = $-125$, B = $7$. Mode signé CA2. Même question.
* En quoi est-ce mieux ?