Aller au contenu principal
Header
🠖 Chapitre 1 : Binaire et codage des nombres et caractères

Cours

1. Origine du binaire en informatique

Pour communiquer, deux êtres humains doivent parler la même langue. L'échange d'informations entre les composants d'un ordinateur repose sur le même principe.
Dans les années 40, lorsqu'il a fallu passer de l'idée abstraite de machine de Turing (modèle mathématique) à la réalisation concrète du premier ordinateur (machine physique), la question des composants matériels à choisir s'est posée (transistor, lampe, DEL, aimant, tube, bande, …). Pour ces composants, il est possible de réduire leur fonctionnement à 2 états exclusifs l'un de l'autre : état 0 et état 1.
  • le transistor est bloqué (état 0) ou passant (état 1),
  • la lampe est éteinte (état 0) ou allumée (état 1),
  • le ruban est trouée (état 0) ou non (état 1),
  • la bande magnétique présente un pôle Nord (état 0) ou Sud (état 1).
transistor.jpg
Le langage finalement choisi pour l'informatique est le binaire, dont l'unité est le bit : binary digit (ou nombre binaire), pouvant prendre comme seules valeurs 0 ou 1.
Analogie : Notre langage humain occidental repose sur 26 valeurs distinctes, les lettres de l'alphabet. En réalité, ce nombre augmente si l'on inclut les accents et la ponctuation ...
communication.png

2. Représentation binaire

Un ordinateur réalise des calculs, il faut donc être capable de convertir tous nos nombres habituels écrit en base décimale, sous forme de mots binaires composés uniquement d'une suite de 0 et de 1, c'est-à-dire écrits en base deux.
Pour nos nombres décimaux, le chiffre de poids le plus fort (ici la centaine) est placé à gauche :
Nombre décimal : 257(10) = (2 × 100) + (5 × 10) + (7 × 1) = (2 × 102) + (5 × 101) + (7 × 100)
Il en sera de même en binaire :
Nombre binaire : 1101(2) = (1 × 23) + (1 × 22) + (0 × 21) + (1 × 20) = 23 + 22 + 20 = 8 + 4 + 1 = 13(10)
Pour compter en binaire, il est alors important de connaître ses puissances de 2 par coeur :
210 29 28 27 26 25 24 23 22 21 20
10245122561286432168421
En informatique, les bits seront souvent regroupés par 8 pour former un octet.
Chapitre 1 : Binaire et codage des nombres et caractères / 1 - Binaire
Niveau d'apprentissage : 0 Réussite : 0/0/4 Difficulté :
Combien d'état différents peuvent être définis avec un bits ?
Doit être un entier.
À l'inverse, il faut être capable de trouver l'écriture binaire d'un nombre décimal :
Exemple :
26(10) = (1 × 24) + 10
           = (1 × 24) + (1 × 23) + 2 = (1 × 24) + (1 × 23) + (0 × 22) + (1 × 21) + (0 × 20)
           = 11010(2)

3. Méthode de conversion : décimal vers binaire

Méthode des divisions successives par deux :

  1. Réaliser des divisions successives sur le nombre décimal à convertir puis sur les quotients obtenus.
  2. Dès que le quotient vaut 0, lire les restes obtenus de dernier au premier.

Méthode rapide :

methode_intuitive.png
  1. Écrire les puissances de 2 de droite à gauche jusqu'à atteindre la valeur du nombre décimal à convertir.
  2. En commençant par la gauche, si la puissance de 2 est inférieure ou égale au nombre, inscrire 1 sous la puissance de 2 sinon 0 et calculer le reste.
  3. Poursuivre ainsi en comparant les restes aux puissances de 2 jusqu'à atteindre 1=20.
Attention : Aucune question trouvée ! Vérifier les numéros des questions.

4. Représentation hexadécimale

L'hexadécimal n'est pas utilisée par les machines qui travaillent en binaire mais cette représentation a l'avantage d'être 4 fois plus courte à écrire, ce qui améliore sa lisibilité pour un humain.
L'hexadécimal utilise 16 symboles : les dix chiffres (de 0 à 9) et les six premières lettres de l'alphabet en majuscule.
Base 10 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Base 16 0 1 2 3 4 5 6 7 8 9 A B C D E F
Base 2 0000 0001 0010 0011 0100 0101 0110011110001001101010111100110111101111
Conversion des entiers naturels de la représentation hexadécimale à la représentation décimale :
Exemple : A3(16) = 10 × 161 + 3 × 160 = 10 × 16 + 3 × 1 = 160 + 3 = 163(10)

Pour convertir des entiers naturels de la représentation binaire à la représentation hexadécimale : Il suffit de regrouper les bits par quatre et de leur associer leur chiffre hexadécimal.
Exemple : 0110 1000 0010 1101(2) = 682D(16)

Pour convertir de la base 10 vers la base 16, il sera souvent plus rapide de passer par la base 2 mais la méthode est similaire.
Chapitre 1 : Binaire et codage des nombres et caractères / 2 - Hexadécimal
Niveau d'apprentissage : 0 Réussite : 0/0/6 Difficulté :
Quelle valeur décimale est représentée par A(16) ?
Doit être un entier.
Compter en binaire c'est comme en décimal : dès que l'on a atteint le maximum (1 en binaire, 9 en décimal) sur un emplacement, il faut ajouter 1 sur l'emplacement à gauche et repartir de 0.
Compteur décimal
Compteur binaire
Décimal012345678910...
Binaire011011100101110111100010011010...
Chapitre 1 : Binaire et codage des nombres et caractères / 2 - Hexadécimal
Niveau d'apprentissage : 0 Réussite : 0/0 Difficulté :
Compter en binaire jusqu'à 25.
11;12;13;14;15;16;17;18;19;20;21;22;23;24;25 1011;1100;1101;1110;1111;10000;10001;10010;10011;10100;10101;10110;10111;11000;11001

5. Additionner et soustraire

Rappel de la méthode de l'addition vue à l'école primaire :
sans retenue :
On additionne les unités entre elles `3 + 4 = 7`, puis les dizaines `1+2=3`.
Ainsi on obtient 3 dizaines et 7 unités soit `23 + 14 = 37`
avec retenue :
On additionne les unités entre elles `8 + 4 = 12`, on pose 2 unité et on retient une dizaine qu'il faudra additionner aux autres dizaines `1_((text(retenue)))+2+3=6`.
Ainsi on obtient 6 dizaines et 2 unités soit `28 + 34 = 62`

Dans une addition avec des nombres binaires, il peut aussi y avoir des retenues, comme en décimal.
En base 10, on ne peut pas dépasser le chiffre 9 et les retenues commencent donc à partir de 9.
En base 2, on ne peut pas dépasser le chiffre 1 et les retenues commencent donc à partir du chiffre 1.

Exemple :
Poser une addition en binaire
(Image cliquable)

En base 16, les retenues commencent après le chiffre F (valant 15 en décimal).

Chapitre 1 : Binaire et codage des nombres et caractères / 3 - Addition et soustraction
Niveau d'apprentissage : 0 Réussite : 0/0/7 Difficulté :
Quel est le résultat binaire de l'addition `1_((2)) + 1_((2))` ?
Doit être un mot binaire.
Rappel de la méthode de la soustraction :
Ne pouvant pas soustraire 6 à 1, on prend une dizaine pour soustraire 6 à 11 et obtenir 5 unités.
Attention, ayant pris une dizaine, il faut maintenant soustraire 2 à 3 (et non 4) pour obtenir 1 dizaine.
Ainsi, `41 - 26 = 15`
Chapitre 1 : Binaire et codage des nombres et caractères / 3 - Addition et soustraction
Niveau d'apprentissage : 0 Réussite : 0/0/9 Difficulté :
Poser, comme en primaire, la soustraction décimale `532_((10)) - 199_((10))`.
Doit être un entier.

5. Codage des entiers relatifs (positifs et négatifs) : le binaire signé

Pour coder les entiers négatifs, il faut coder le signe. Dans la représentation en binaire signé sur 8 bits, le bit de poids le plus fort (celui tout à gauche) sert à coder le signe :
1 pour un entier négatif,
0 pour un entier positif.

Exemple : Pour une représentation binaire signé sur 1 octet : −4(10) = 1000 0100(2𝑠)
Chapitre 1 : Binaire et codage des nombres et caractères / 4 - Codage des entiers relatifs
Niveau d'apprentissage : 0 Réussite : 0/0/16 Difficulté :
Quelle est la représentation en binaire signé sur 8 bits de la valeur décimale 1(10) ?
Doit être un octet.
Cette représentation des entiers relatifs ne conserve pas l'addition. En effet, si l'on fait l'addition binaire des représentations en binaire signé sur 8 bits de `4` et `-4`, le résultat n'est pas nul et vaut -8.
`+4_((10)) = 00000100_((2s))`
`-4_((10)) = 10000100_((2s))`
`-8_((10)) = 10001000_((2s))`

6. Codage des entiers relatifs : le complément à 2

Pour conserver la propriété d'addition sur les entiers relatifs en binaire, une autre méthode de représentation existe : le complément à 2.
Pour obtenir le complément à 2 d'un nombre :

  • s'il est positif, on prend sa représentation en binaire simple,
  • s'il est négatif, on prend son complément à 1 (en inversant tous les bits : 1 devient 0 et 0 devient 1) et on additionne 1. (Cela revient à inverser que les bits de gauche à droite jusqu'au dernier 1 rencontré que l'on n'inverse pas.)

Le bits de poids le plus fort donne l'information du signe comme en binaire signé : 1 pour – et 0 pour +.

Exemples :
`4_((10)) = 0000 0100_((2)) = 0000 0100_((c2))`
`-4_((10)) = 1111 1100_((c2)`
`11_((10)) = 0000 1011_((2)) = 0000 1011_((c2))`
`-11_((10)) = 1111 0101_((c2)) `
Chapitre 1 : Binaire et codage des nombres et caractères / 4 - Codage des entiers relatifs
Niveau d'apprentissage : 0 Réussite : 0/0 Difficulté :
Quel est l'avantage du complément à deux sur le binaire signé pour coder les entiers relatifs ?
Cocher la bonne réponse.
→ Voir la vidéo : Twos complement: Negative numbers in binary de Ben Eater

7. Codage des réels : virgule fixe

7.1. Principe

Tous les réels ne vont pas pouvoir être codés notamment ceux possédant un nombre infini de chiffre après la virgule tel que π.
Leur représentation sera toujours une approximation.
Pour convertir la partie fractionnaire d'un nombre, en binaire, il faut utiliser les puissances de 2 négatives.
`2^(-1)``2^(-2)``2^(-3)``2^(-4)``2^(-5)``2^(-6)``2^(-7)``2^(-8)`
0,50,250,1250,06250,031250,0156250,00781250,00390625

Cette méthode de codage à virgule fixe reprend le principe du binaire signé :

  • le premier bit code le signe (1 pour – et 0 pour +)
  • une partie des bits suivants codent pour la partie entière (pondération des puissances positives de 2)
  • et les autres pour la partie fractionnaire (pondération des puissances négatives de 2).

Pour un codage sur 1 octet (8 bits) : 1 bit de signe / 3 bits de partie entière / 4 bits de partie fractionnaire
Pour un codage sur 2 octets (16 bits) : 1 bit de signe / 7 bits de partie entière / 8 bits de partie fractionnaire

Exemple :
Pour un codage sur 16 bits à virgule fixe : +10, 25(10) = 0000 1010, 0100 0000(2fix)
Pour la partie entière : 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20 = 8 + 2 = 10
Pour la partie fractionnaire : 0 × 2−1 + 1 × 2−2 = 0 × 0,5 + 1 × 0,25 = 0,25

Chapitre 1 : Binaire et codage des nombres et caractères / 5 - Codage des réels
Niveau d'apprentissage : 0 Réussite : 0/0/8 Difficulté :
1 min

7.2. Méthode de conversion de la partie fractionnaire : de décimal vers binaire

Pour convertir un nombre fractionnaire en binaire, il faut réaliser des multiplications successives par deux, des parties fractionnaires, en gardant la partie entière des résultats. Dans la plupart des cas, la méthode entraîne une boucle : le résultat sera une suite se répétant à l'infini. Ainsi, la représentation sur un nombre fini de bits introduit obligatoirement une approximation.

Exemple :

Méthode de conversion de la partie fractionnaire
(Image cliquable)
Le résultat s'écrit en binaire :
`0,2_((10)) = 0,0011 0011 0011 0011 0011..._((2))`

en binaire à virgule fixe sur 16 bits :
`0,2_((10)) ~~ 0000 0000, 0011 0011_((2fix))`
Si l'on réaliser l'addition binaire sur 16 bits de `0,2_((10))` et `0,1 _((10))` va-t-on obtenir `0,3_((10))` ?
Non ! puisque les représentations en binaire sur 16 bits sont ici des approximations.
`0,2_((10)) + 0,1_((10)) ~~ 0000 0000, 0011 0011_((2fix)) + 0000 0000, 0001 1001_((2fix)) = 0000 0000, 0100 1100_((2fix)) = 0,296875_((10))`.
En programmation, il dangereux de vérifier l'égalité de deux nombres à virgule.
Rappelez-vous que certaines valeurs ne sont pas représentables parfaitement en binaire. De la même façon que `1/3` n'est pas représentable en décimal car cela nécessiterait d'écrire `0,333...` suivi d'une infinité de `3` ce qui est impossible, certains nombres ne sont pas représentables parfaitement en binaire et seront donc représentés de manière approchée.
Chapitre 1 : Binaire et codage des nombres et caractères / 5 - Codage des réels
Niveau d'apprentissage : 0 Réussite : 0/0/14 Difficulté :
Donner la représentation en binaire signé à virgule fixe sur 8 bits de la valeur décimale 0,6(10) ?
Doit être un octet.

8. Codage des réels : virgule flottante

La technique de représentation des nombres à virgule fixe est simple mais pas optimale du fait des bits souvent perdus car ils ne portent aucune information. Une autre technique est celle des nombres à virgule flottante.
Pour représenter un nombre binaire à virgule flottante, il faut d'abord l'exprimer en notation scientifique binaire sous la forme : `text(mantisse)xx2^text(exposant)`.
La mantisse est obligatoirement supérieure à 1.
Sur 8 bits, la représentation binaire à virgule flottante se compose de : 1 bit pour le signe / 3 bits pour l'exposant / 4 bits pour la partie fractionnaire de la mantisse.
Exemple : -2,625(10) = -10,101(2) = -1,0101(2) × 21 = 01000101(2flo)
Le 1 de la partie entière de la mantisse est , il est donc inutile de perdre un bit à le coder.
L'exposant peut être négatif donc pour permettre de coder autant d'exposants positifs que négatifs sur seulement 3 bits (soit 8 valeurs possibles), la norme IEEE-754 impose d'ajouter 3 à l'exposant.
Dans notre cas, l'exposant est 1(10) donc 1 + 3 = 4(10) = 100(2).
Chapitre 1 : Binaire et codage des nombres et caractères / 5 - Codage des réels
Niveau d'apprentissage : 0 Réussite : 0/0 Difficulté :
Dans la représentation binaire à virgule flottante sur 8 bits,
Cocher la ou les bonnes réponses.
La norme IEEE-754 est réellement définie sur 32 ou 64 bits, ce qui permet d'écrire de très grands nombres.
→ Pour aller plus loin, voir la vidéo : Decimal to IEEE 754 Floating Point Representation de Abishalini Sivaraman

9. Codage des caractères

Dans un second temps, les informaticiens ont voulu coder non seulement les nombres, mais aussi l'ensemble des caractères.
Une première table de correspondance a été établie, associant à chaque caractère (a, b, !, espace, virgule, …) un mot binaire de 7 bits. Définie en 1960, cette table est encore utilisée aujourd'hui. Il s'agit de la table ASCII :
Caractère ASCII
(Langage humain)
Code ASCII
décimal
Mot binaire de 7 bits
(Langage machine)
a97110 0001
?63011 1111
→ Voir la table complète sur Wikipédia.
Afin de pouvoir coder les caractères européens (accent, cédille, …), une autre norme a été définit en 1986. Elle s'appelle ISO-8859-1 ou Latin-1. Chaque caractère est alors codé sur 8 bits soit 1 octet.
Ces systèmes de codage ont encore évolué afin d'inclure de plus en plus de caractère.
La norme Unicode (ou UTF-8) vise à coder tous les caractères du monde entier et pour cela, elle est capable d'adapter le nombre de bits nécessaire à l'alphabet de 1 à 4 octets afin d'assurer une rétrocompatibilité avec les premiers tables.
Exemple : Voici quatre exemples de codage en UTF-8 de caractère :
  • A est codé par 0100 0001(2) = 41(16)
  • Ω est codé par 1100 1110 1010 1001(2) = CE A9(16)
  • ∞ est codé par 1110 0010 1000 1000 1001 1110(2) = E2 88 9E(16)
  • 𐎄 est codé par 1111 0000 1001 0000 1000 1110 1000 0100(2) = F0 90 8E 84(16)
Chapitre 1 : Binaire et codage des nombres et caractères / 6 - Codage des caractères
Niveau d'apprentissage : 0 Réussite : 0/0 Difficulté :
Combien de caractères peut contenir la table ASCII originelle utilisant 7 bits ?
Doit être un entier.
Chapitre 1 : Binaire et codage des nombres et caractères S'entrainer