Entiers relatifs
Note
🤔 Le but est de trouver un moyen, avec des 0 et des 1 de reprĂ©senter un entier nĂ©gatif.
Comment coder â 6 ?
I. Une premiĂšre pisteâïž
On pourrait imaginer utiliser un bit de signe.
đ On convient de travailler sur 8 bits, ce qui est plus simple, et ne change rien Ă la comprĂ©hension du principe.
6 est codé sur 8 bits en binaire par :
Question
6 est codé sur 8 bits en binaire par :
Solution
0000 0110
Question
🤔 On peut imaginer de rĂ©server le bit de gauche (de poids fort) au signe, et de lui donner la valeur 0 pour un signe positif et 1 pour un signe nĂ©gatif.
👉 Avec cette convention, - 6 serait codĂ© sur 8 bits en binaire par :
Solution
1000 0110
Question
Avec cette convention, rĂ©aliser en binaire lâopĂ©ration 6 + (-6) :
🌵 Quel est le problĂšme ?
Solution
đ Le rĂ©sultat de 6 +(- 6) ne donnerait pas 0, mais - 12
II. Recherche de lâopposĂ© dâun entierâïž
Note
💡 On va chercher Ă trouver une reprĂ©sentation de - 6 sur 8 bits, qui respecte le fait que 6 + (- 6 ) = 0
Pour cela, compléter l'addition "à trou" suivante
On trouve donc qu'une reprĂ©sentation de - 6 pourrait ĂȘtre :
1111 1010
Le bon choix
đĄ C'est effectivement cette reprĂ©sentation qui va ĂȘtre choisie. La mĂ©thode est ingĂ©nieuse : le 1 le plus Ă gauche (le bit de poids fort) du rĂ©sultat "disparaĂźt" car on ne dispose que de 8 bits. Le rĂ©sultat devrait ĂȘtre 1 0000 0000, mais seuls les 8 bits contenant 0000 0000 sont conservĂ©s.
Précision
L'opposé d'un entier, est une sorte de "complément à 0". Ici, en fait, nous avons fait un "complément à 1 0000 0000", c'est à dire en décimal à \(2^8\). Dans la pratique, on dit simplement qu'on a fait le complément à 2.
Généralisation sur \(n\) bits
La méthode se transpose sur \(n\) bits. On fait donc un complément à \(2^n\), qui est toujours appelé complément à 2.
III. MĂ©thode du complĂ©ment Ă 2âïž
Comment faire ?
Nous allons voir sur notre exemple, une mĂ©thode qui donne le mĂȘme rĂ©sultat, sans poser l'addition Ă trou.
- Etape 1 : coder 6 sur 8 bits, et donc bien mettre tous les 0 nécessaires à gauche : 0000 0110
- Etape 2 : "inverser les bits" : 1111 1001
- Etape 3 : Ajouter 1
Exemple
đ On retrouve le rĂ©sultat que l'on avait avec l'addition "Ă trou"
Résumé : Pour écrire un entier négatif en complément à 2 sur \(n\) bits :
- Coder la partie positive de l'entier (sa valeur absolue) sur \(n\) bits en binaire, en rajoutant des 0 à gauche si nécessaire.
- Inverser tous les bits.
- Ajouter 1.
Vocabulaire : le complément à 1
👉 Inverser tous les bits s'appelle faire le complĂ©ment Ă 1. Par exemple le complĂ©ment Ă 1 de 1010 1010 est 0101 0101. L'Ă©tape 2 consiste donc Ă faire le complĂ©ment Ă 1.
Notations
Il existe plusieurs notations possibles :
\((-6)_{10}=(11111010)_{c2}=(11111010)_{A2}=(11111010)_{cpt2}\) etc.
Le contexte permet de comprendre qu'il s'agit d'un entier codé en complément à 2.
A vous de jouer 1 !
Utiliser la méthode du complément à 2 pour coder sur 8 bits : - 36
Solution
- 36 sur 8 bits : 0010 0100
- Inversion des bits : 1101 1011
- Ajout de 1 : 1101 1100
đ La rĂ©ponse est donc : 1101 1100
A vous de jouer 2 !
Utiliser la méthode du complément à 2 pour coder sur 8 bits : - 75
Solution
- 75 sur 8 bits : 0100 1011
- Inversion des bits : 1011 0100
- Ajout de 1 : 1011 0101
đ La rĂ©ponse est 1011 0101
Convertir en décimal un nombre donné en complément à 2
Exemple
Le codage sur 8 bits de - 6 en complément à 2 est : 1111 1010
Calculer : \(- 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^1\)
Qu'obtenez-vous?
Solution
\(- 6\)
Faire un calcul analogue pour - 36
Solution
Le codage sur 8 bits de - 36 en complément à 2 est : 1101 1100
\(- 2^7 + 2^6 + 2^4 + 2^3 + 2^2 = - 36\)
Faire un calcul analogue pour - 75
Solution
Le codage sur 8 bits de - 75 en complément à 2 est : 1011 0101
\(- 2^7 + 2^5 + 2^4 + 2^2+1 = - 75\)
Résumé :
Pour convertir un nombre entier nĂ©gatif codĂ© en complĂ©ment Ă 2 sur n bits en dĂ©cimal, on procĂšde comme sâil Ă©tait codĂ© en binaire, sauf que le terme correspondant au bit de poids fort (correspondant au coefficient de \(2^{n-1}\)) est multipliĂ© par -1.
Conséquence : les entiers positifs
Pour convertir un nombre entier positif codĂ© en complĂ©ment Ă 2 sur n bits on le code en binaire. Le terme correspondant au bit de poids fort (correspondant au coefficient de \(2^{n-1}\)) doit absolument ĂȘtre Ă©gal Ă 0 (sinon, cela correspondrait Ă un entier nĂ©gatif)
Convertir
1. Convertir le nombre 1010 1010 donné en complément à 2 sur 8 bits en base 10 :
Solution
\(-2^7 + 2^5+ 2^3+ 2^1 = -128+32+8+2= - 86\)
2. Convertir le nombre 0110 1010 donné en complément à 2 sur 8 bits en base 10 :
Solution
\(0 \times (-2^7) + 2^6 + 2^5+ 2^3+ 2^1 = 64+32+8+2= 106\)
✏️ Un petit problĂšme :
Essayer de coder sur 8 bits, avec la méthode du complément à 2 : - 135.
Solution
- 135 sur 8 bits : 1000 0111
- Inversion des bits : 0111 1000
- Ajout de 1 : 0111 1001
đ La rĂ©ponse est 0111 1001
😢 Pourquoi ce rĂ©sultat est-il impossible ?
Solution
Le bit de poids fort est Ă 0, ce qui correspond Ă un entier positif.
Essayer de coder sur 8 bits, avec la méthode du complément à 2 : 130.
Solution
130 en binaire sur 8 bits : 1000 0010
😢 Pourquoi ce rĂ©sultat est-il impossible ?
Solution
Le bit de poids fort est à 1, ce qui correspond à un entier négatif.
IV. Entiers que lâon peut reprĂ©senter en complĂ©ment Ă deux :âïž
Sur 8 bits
- Sur 8 bits, le plus petit entier que lâon peut reprĂ©senter est donc :
\(-1 \times 2^7 + 0 \times 2^6+ 0 \times 2^5+ 0 \times 2^4+ 0 \times 2^3+ 0 \times 2^2+ 0 \times 2^1+ 0 \times 2^ 0= -128 = -2^7\)
Il est codé par 1000 0000.
- Sur 8 bits, le plus grand entier que lâon peut reprĂ©senter est donc :
\(0 \times 2^7 + 1 \times 2^6+1 \times 2^5+ 1 \times 2^4+ 1 \times 2^3+ 1 \times 2^2+ 1 \times 2^1+ 1 \times 2^ 0= 127 = 2^7-1\)
Il est codé par 0111 1111.
Résumé :
Avec \(n\) bits, il devient possible de reprĂ©senter \(2^n\) entiers compris entre \(−2^{n−1}\) et \(2^{n−1}−1\).
V. Exercicesâïž
Exercice 1
Les nombres ci-dessous sont codés en complément à 2 sur 8 bits. Les convertir en décimal.
a) \((1111\ 0111)_{cpt2}\)
b) \((1011\ 0101)_{cpt2}\)
c) \((0011\ 0101)_{cpt2}\)
Solution
a) \(- 2^7 + 2^6 + 2^5+ 2^4 + 2^2 + 2^1+ 1=-9\)
b) \(- 2^7 + 2^5+ 2^4+ 2^2 + 1=- 75\)
c) \(2^5+ 2^4+ 2^2 + 1= 53\)
Exercice 2 : le bug de l'an 2038
1. Quel est le plus grand entier positif que l'on peut coder en complément à 2 sur 32 bits ? En donner la valeur exacte en base 10.
Solution
\(2^{31}-1=2~147~483~647\)
2. Que se passe-t-il si on ajoute 1 au nombre trouvé en question 1? Quel nombre représente-t-il en base 10 sachant qu'il est codé en complément à 2 sur 32 bits ?
Solution
\(2^{31}-1 + 1=2^{31}\) est codé par 10000000 00000000 00000000 00000000. Ce nombre est égal à \(-2^{31}=-2~147~483~648\)
3. L'heure Unix ou heure Posix est une mesure du temps fondĂ©e sur le nombre de secondes Ă©coulĂ©es depuis le 1er janvier 1970 00:00:00 UTC, hors secondes intercalaires. Elle est utilisĂ©e principalement dans les systĂšmes qui respectent la norme POSIX, dont les systĂšmes de type Unix, d'oĂč son nom. C'est la reprĂ©sentation POSIX du temps.
NB: cette date du « 1er janvier 1970 00:00:00 UTC » est appelée « époque Unix ».
Source : Wikipédia
Le site unixtime permet la conversion entre temps Unix et temps UTC (Universal Time Coordinated ou Temps Universel Coordonné en français)
a) Déterminer la date correspondant à 2 147 483 647 en temps UTC
b) Déterminer la date correspondant à -2 147 483 648 en temps UTC
Solution
a) 19/01/2038 @ 03:14:07
b) 13/12/1901 @ 20:45:52
4 Lire cet article du journal Le Parisien ainsi que cet article de Wikipédia.
Quel est le problÚme pour les systÚmes qui mesurent le temps en temps Unix codé en complément à 2 sur 32 bits ?
Solution
Le 19 janvier 2038 Ă 3 h 14 min 8 s, temps universel, les systĂšmes affectĂ©s par le bug considĂ©reront alors ĂȘtre le 13 dĂ©cembre 1901 Ă 20 h 45 min 52 s.
VI. QCMâïž
1. Que peut-on dire de l'entier relatif \(10100001_2\) codé sur 8 bits en complément à deux ?
- a) Cet entier est pair.
- b) Cet entier est négatif.
- c) Cet entier est positif.
- d) Cet entier vaut \(-23_{10}\).
2. Si 1011 est un entier signé sur quatre bits en complément à 2, alors sa valeur décimale est :
- a) -7
- b) - 5
- c) 5
- d) 7
3. Donner l'écriture de \(-3_{10}\) en complément à deux sur quatre bits :
- a) 0111
- b) 1101
- c) 1011
- d) 1111