# 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 ?