Données Binaire

Identification

Infoforall

1 - Binaire, octet et stockage


Un système informatique ne sait que stocker des  0  ou des  1 .

Il faut donc savoir passer d'une représentation décimale (base 10) en représentation binaire (base 2).

Encore faut-il savoir comment cela fonctionne...

C'est le principe de cette première activité.

Logiciel nécessaire pour l'activité : Arduino, la bibliothèque Makeblock et un robot, uniquement si vous voulez reproduire l'expérience d'introduction.

Documents de cours : open document ou pdf

1 - Exemple d'introduction

Regardons ce petit programme Arduino (proche du C++) qu'on va appliquer à un robot Makeblock, compatible Arduino.

Le but est de le faire tourner sur lui-même de plus en plus rapidement.

Nous n'analyserons pas en détail le code. Si vous voulez en savoir plus sur ce langage, allez voir l'annexe ou la partie dédiée.

Comment commander un robot qui possède deux systèmes de motorisation, un à gauche et un à droite pour qu'il tourne sur lui-même ?

Avec le système Makeblock, c'est facile :

  • Si on commande chaque moteur avec une vitesse positive, le robot va avancer.
  • motor_gauche.run(vitesse); motor_droit.run(vitesse);
  • Si on commande chaque moteur avec une vitesse négative, le moteur va reculer.
  • motor_gauche.run(-vitesse); motor_droit.run(-vitesse);
  • Et finalement, si on commande les deux moteurs avec une même valeur mais l'une positive et l'autre négative, le robot va tourner sur lui-même !
  • motor_gauche.run(vitesse); motor_droit.run(-vitesse);

Et comment augmenter progressivement la vitesse de 1 toutes les 200 ms (soit 0.2s) ?

Simplement en faisant une boucle FOR partant de 0 et s'arrêtant à 499 par exemple :

for (byte vitesse = 0; vitesse < 500 ; vitesse++) { motor_gauche.run(vitesse); motor_droit.run(-vitesse); delay(200); }

On notera que la boucle FOR se code différement qu'en Python mais qu'on retrouve :

  • la valeur initiale : vitesse = 0
  • D'augmentation de 1 à chaque bouclage : vitesse++. C'est une façon d'écrire vitesse = vitesse + 1
  • La valeur finale à atteindre : vitesse < 500. Comme on a strictement inférieur, la vitesse atteindra 499, pas 500.

L'une des grosses différences du C (et d'Arduino) par rapport à Python est qu'on doit impérativement fournir le type de la variable qu'on est en train de créer. Ici, j'ai choisi de stocker mes entiers dans une variable de type byte. Dans ce contexte, celui correspond à un octet. Nous verrons ce que cela représente dans cette activité.

Finalement, comment afficher la valeur de la variable vitesse lors de chaque bouclage ?

En lisant la documentation, on se rend compte qu'il existe une méthode permettant d'agir sur les afficheurs : la méthode display.

for (byte vitesse = 0; vitesse < 500 ; vitesse++) { motor_gauche.run(vitesse); motor_droit.run(-vitesse); afficheur.display(vitesse); delay(200); }

Voici le code en intégralité :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* 1 Importation de la biliothèque MeOrion */ #include "MeOrion.h" /* 2 Instanciations des objets permettant de controler le robot */ MeDCMotor moteur_gauche(M1); MeDCMotor moteur_droit(M2); Me7SegmentDisplay afficheur(PORT_6); /* 3 Fonction setup qui s'active une fois automatiquement au lancement */ void setup() { for (byte vitesse = 0; vitesse < 500 ; vitesse++) { moteur_gauche.run(vitesse); moteur_droit.run(-vitesse); afficheur.display(vitesse); delay(200); } moteur_gauche.stop(); moteur_droit.stop(); } /* 4 Fonction loop qui s'active en boucle une fois le setup effectué */ void loop() { }

CLIQUEZ ICI POUR VOIR L'ANIMATION :

moteur_gauche :

moteur_droit :

afficheur :

vitesse :

Alors ça marche ce code ?

Si vous n'avez pas la possibilité d'avoir ce robot, voici un exemple de fonctionnement

Et oui. Ca ne marche pas !

La réalité vient d'immerger dans le code.

Déjà, j'ai du mal à trouver mon bouton. Bon ça, c'est pas grave.

Ensuite, le moteur ne bouge pas ou mal à faible vitesse. C'est normal aussi. Il ne parvient pas à contrer les frottements statiques.

Par contre, ensuite, il va bien de plus en plus vite mais s'arrête à 255 ! Et le compteur repart à 0 ! Et ensuite, le compteur augmente et s'arrête encore à 255.

Pourtant, 255 + 255 ca donne déjà plus que 500 !

Mais c'est quoi ce truc. Pourquoi tant de haine ?

La réponse n'est pas dans le code (enfin, si, un peu). En réalité, la réponse ne peut se trouver que si on connait la façon dont l'ordinateur va stocker la variable vitesse et la transmettre à la méthode run.

Or, si nous avions lu la documentation de la méthode run, nous aurions trouvé ceci : l'argument à transmettre via run doit être un entier x tel que : 0 ≤ x ≤ 255.

Pour 0, d'accord. Une vitesse de 0, c'est compréhensible.

Mais pourquoi prendre 255 pour la vitesse maximale ? C'est un peu tordu non ?

Pour comprendre cela, nous allons devoir travailler un peu sur le binaire ! Et oui...

2 - Le décimal : la base 10

Vous allez sans doute vous demander pourquoi revoir quelque chose d'aussi basique et trivial. Et bien, c'est justement cela le problème.

Vous avez acquis assez de connaissances sur les calculs sur cette base pour ne plus vous demander exactement comment cela fonctionne.

Mais nous allons avoir besoin de ce fonctionnement interne pour comprendre les autres bases.

1.1 Cases : unité, dizaine, centaine ...

Voyons comment fonctionne le décodage d'un nombre en base 10 ainsi que l'addition.

Si j'écris  M = 3 4 2 9 , je fais ceci en réalité dans ma tête :

Nombre M = 3 4 2 9
La case code 1000 100 10 1
On obtient donc 3000 400 20 9

D'ou la valeur de M en base 10 : M = 3000 + 400 + 20 +9 =  3429 .

Que peut-on mettre dans les cases en décimal ?

Des chiffres.

Combien et lesquels ?

Base 10 donc 10 CHIFFRES :  0  -  1  -  2  -  3  -  4  -  5  -  6  -  7  -  8  -  9 .

On remarquera que la case de poids le plus faible ( 1 ) est située à droite.

Dernière remarque :

Poids de case exprimé en puissance de 10

On peut écrire facilement le poids des cases en utilisant les puissances de 10 :

La case code 1000 100 10  1 
qu'on peut écrire sous la forme 103 102 101 100

1.2 Addition

Alors ça fonctionne comment l'addition ? Pourquoi 9+1 donne 10 ? On se le demande non ?

En réalité, il y a une logique interne à toutes les additions. La plupart des gens ont juste fini par l'oublier car on n'a pas réellement besoin d'avoir cette connaissance activement en tête pour parvenir à faire l'addition.

Jusqu'à 9, il n'y a pas de difficulté, il suffit de suivre la liste des CHIFFRES disponibles.

Base 10 donc 10 CHIFFRES :  0  -  1  -  2  -  3  -  4  -  5  -  6  -  7  -  8  -  9 .

Méthode à utiliser pour incrémenter (rajouter 1)
  • Tenter de rajouter 1 dans la case de l'unité (la case de poids faible, celle de droite). Pour cela, il suffit de placer le prochain chiffre dans la liste
     0  1  2  3  4  5  6  7  8  9 
  • Si on est déja au dernier chiffre (  9  ), on revient au premier chiffre (  0  ) dans cette case ET on rajoute un dans la case juste à gauche. On fait une retenue.

Exemple 1 :

Si on rajoute 1 à 8
on obtient 9

...EXPLICATION...

On peut augmenter le chiffre de l'unité  8  en le faisant juste passer au chiffre suivant :  9 .

Exemple 2 : cette fois, on va devoir rajouter une case à droite (elle contient 0 initialement puisqu'elle n'apparaît pas)

Si on rajoute 1 à 9
on obtient 1 0

...EXPLICATION...

On ne peut augmenter le chiffre de l'unité qui est déjà à  9 .

On la passe donc à  0  ET on incrémente la case juste à gauche.

La case des dizaines était initialement à  0  : elle passe donc à  1 .

Exemple 3 :

Si on rajoute 1 à 1 3
on obtient 1 4

...EXPLICATION...

On peut augmenter le chiffre de l'unité  3  en le faisant juste passer au chiffre suivant :  4 .

Exemple 4 :

Si on rajoute 1 à 3 9 9
on obtient 4 0 0

...EXPLICATION...

On ne peut augmenter le chiffre qui est déjà à  9 .

On la passe donc à  0  ET on incrémente la case juste à gauche.


La case des dizaines était initialement à  9  : elle passe donc à  0  également et on va devoir augmenter de 1 la case suivante, la case des centaines.


Le chiffre des centaines  3  passe donc à  4 .

1.3 Nombres de cas dénombrables

Si on ne possède qu'une case  ?  à remplir, on peut donc définir 10 valeurs de  0  à  9 .

Comme le premier cas est numéroté 0, on a bien 9+1 = 10 valeurs possibles.

Si on dispose de 2 cases  ??  à remplir, on peut définir des valeurs de  00  à  99 .

Comme le premier cas est numéroté 0, on a bien 99+1 = 100 valeurs possibles.

Si on dispose de 3 cases  ???  à remplir, on peut définir des valeurs de  000  à  999 .

Comme le premier cas est numéroté 0, on a bien 999+1 = 1000 valeurs possibles.

On voit bien qu'il y a une généralisation à trouver. Laquelle ?

Je vous laisse chercher un peu ...

Et la réponse est :

Nombre de cas dénombrables en base 10

En décimal, si on dispose de X cases pouvant accueillir un des 10 chiffres de la base 10, le nombre de valeurs possibles est 10X.

Attention : dans la mesure où le premier cas est 0, la valeur maximale est donc 10X - 1

Exemple : si on dispose de 9 cases

  • Le nombre de possibilité est 109 = 1 000 000 000
  • On peut alors stocker des valeurs partant de 0 jusqu'à 999 999 999.

On a donc un milliard de possibilités mais on ne peut pas compter jusqu'à précisement un milliard puisque le cas 0 existe.

1.4 Bilan sur la base 10 (décimal)

Résumé décimal
  1. Que peut-on mettre dans les cases d'un nombre en base 10 ?
  2. Des chiffres. Combien et lesquels ?

    Base 10 donc 10 CHIFFRES :  0  -  1  -  2  -  3  -  4  -  5  -  6  -  7  -  8  -  9 .

  3. On peut facilement trouver le poids des cases en utilisant les puissances de 10 :
  4. La case code 1000 100 10  1 
    qu'on peut écrire sous la forme 103 102 101 100
  5. Méthode à utiliser pour incrémenter (rajouter 1)
    • Tenter de rajouter 1 dans la case de l'unité (la case de poids faible, celle de droite). Pour cela, il suffit de placer le prochain chiffre dans la liste
       0  1  2  3  4  5  6  7  8  9 
    • Si on est déja au dernier chiffre (  9  ), on revient au premier chiffre (  0  ) dans cette case ET on rajoute un dans la case juste à gauche.
  6. Nombre de valeurs disponibles en base 10
  7. En décimal, si on dispose de X cases pouvant accueillir un des 10 chiffres de la base 10, le nombre de valeurs possibles est 10X.

    Attention : dans la mesure où le premier cas est 0, la valeur maximale est donc 10X - 1

    Exemple : si on dispose de 9 cases

    • Le nombre de possibilité est 109 = 1 000 000 000
    • On peut alors stocker des valeurs partant de 0 jusqu'à 999 999 999.

    On a donc un milliard de possibilités mais on ne peut pas compter jusqu'à précisement un milliard puisque le cas 0 existe.

3 - Le binaire : la base 2

Si vous avez compris comment fonctionne la base 10, vous avez compris la base 2 puisque c'est plus simple : il n'y a que deux chiffres possibles  0  ou  1  !

Pourquoi le binaire en informatique

Nous allons avoir besoin de comprendre cette base car c'est la façon dont l'ordinateur stocke des informations (nombres, textes, images, vidéos...) en mémoire.

Avec les technologies électroniques, la case mémoire contient des électrons (1) ou n'en contiennent pas (0). Voilà pourquoi tout est codé en  0  ou  1 .

Lorsqu'on programme à l'aide d'un langage de haut niveau, on ne s'en rend pas compte puisque ce type de langage est justement créé pour être une interface facilement compréhensible pour un humain. C'est l'interpréteur qui va faire le travail de traduction.

Si on ouvre une clé USB, on peut voir ceci : pas facile de voir les 0 ou les 1.

usb

Dans les premiers ordinateurs, les 0 et 1 des programmes étaient stockées sur des cartes perforées : c'était plus simple à visualiser : c'est perforé ou non perforé, 0 ou 1.

1.1 Cases : les bits

Voyons comment fonctionne le décodage d'un nombre en base 2 ainsi que l'addition.

Il suffit de transformer ce que nous avons vu avec la base 10.

Première modification : le contenu des cases

Que peut-on mettre dans les cases d'un nombre en base 2 ?

Des chiffres. Combien et lesquels ?

Base 2 donc 2 CHIFFRES :  0  -  1 . Et c'est tout.

Deuxième modification : le 'nom' des cases

Binary digit : bit

En binaire, un bit est le nom donné à l'élément de base permettant à l'ordinateur de gérer l'information. Il s'agit donc d'un élément ne pouvant valoir que  0  ou  1 .

Le mot BIT provient de la contraction de BINARY DIGIT.

Troisième modification : le poids des cases

Poids des bits

On peut facilement trouver le poids des cases en utilisant les puissances de 2 puisqu'on multiplie à chaque fois le poids de la case (le bit) par deux :

La case code 8 4 2  1 
qu'on peut écrire sous la forme 23 22 21 20

Le bit de poids faible est à droite. Comme en base 10.

Exemple 1

Si j'écris un nombre à 4 bits  M = 1 0 1 1 , je dois faire ceci pour trouver la valeur de ce nombre en base 10 :

Nombre M = 1 0 1 1
La case code 8 4 2 1
On obtient donc 8 0 2 1

D'ou la valeur de M en base 10 : M = 8 + 0 + 2 + 1 =  11 .

Exemple 2

Si j'écris un nombre à 4 bits  M = 1 1 0 0 , je dois faire ceci pour trouver la valeur de ce nombre en base 10 :

Nombre M = 1 1 0 0
La case code 8 4 2 1
On obtient donc 8 4 0 0

D'ou la valeur de M en base 10 : M = 8 + 4 + 0 + 0 =  12 .

01° Déterminer la valeur en base 10 des nombres A, B, C fournis en binaire :

  • Nombre A
  • Nombre A = 1 0 0 0
    La case code 8 4 2 1
    On obtient donc ? ? ? ?
  • Nombre B
  • Nombre B = 0 0 1 0
    La case code 8 4 2 1
  • Nombre C
  • Nombre C = 0 1 1 0

...CORRECTION...

A = 8 + 0 + 0 + 0 = 8 en base 10

B = 0 + 0 + 2 + 0 = 2 en base 10

C = 0 + 4 + 2 + 0 = 6 en base 10

Notation des bases

C'est un peu bizarre d'écrire que 1100 = 12 ou que 1011 = 11 non ?

Le problème vient du fait qu'un nombre en base 10 peut très bien ne contenir que des 1 et 0. Mille par exemple : 1000.

Or 1000 pourrait également représenter un nombre en base 2.

Nombre M = 1 0 0 0
La case code 8 4 2 1
On obtient donc 8 0 0 0

D'ou la valeur de M en base 10 : M = 8 + 0 + 0 + 0 =  8 .

On voit donc que

  • 1000 en base 10 vaut 1000 en base 10
  • 1000 en base 2 vaut 8 en base 10

Pour rendre les choses plus claires, on devrait noter la base utilisée lorsqu'on note un nombre. Une notation courante consiste à indiquer la base en indice, avec ou sans parenthèses.

  • 100010 = ( 1000 )10
  • 10002 = ( 1000 )2 = 810 = ( 8 )10

Le décimal (base 10) étant notre base naturelle, nous avons pris l'habitude de ne pas préciser lorsqu'on fournit un nombre dans cette base. On retrouve assez souvent cette façon de faire dans les textes :

  • 100010 = 1000
  • 10002 = 8

A titre d'exemple final, voilà la correction de l'exercice 1 en utilisant ces notations :

A = 10002 = ( 8 + 0 + 0 + 0 )10 = 8

B = 00102 = ( 0 + 0 + 2 + 0 )10 = 2

C = 01102 = ( 0 + 4 + 2 + 0 )10 = 6

C'est déjà plus clair.

2.2 Addition

Alors ça fonctionne comment l'addition ? Pourquoi 12 + 12 donne 102 ? On se le demande non ?

Jusqu'à 1, il n'y a pas de difficulté, il suffit de suivre la liste des CHIFFRES disponibles :  0  puis  1 .

Incrémenter en binaire (rajouter 1)
  • Tentez de rajouter 1 dans la case de l'unité (la case de poids faible, celle de droite)
    • Un  0  devient  1 
    • Un  1  étant le dernier chiffre en base 2, on repasse à  0  en rajoutant  1  dans la case juste à gauche.

Exemple 1 :

Si on rajoute 1 à 0
on obtient 1

...EXPLICATION...

On peut augmenter le chiffre de l'unité  0  en le faisant juste passer au chiffre suivant :  1 .

Exemple 2 : cette fois, on va devoir rajouter une case à droite (elle contient 0 initialement puisqu'elle n'apparaît pas)

Si on rajoute 1 à 1
on obtient 1 0

...EXPLICATION...

On ne peut augmenter le chiffre de l'unité qui est déjà à  1 .

On le repasse donc à  0  ET on incrémente la case juste à gauche.

La case des "dizaines" était initialement à  0  : elle passe donc à  1 .

Exemple 3 :

Si on rajoute 1 à 1 0
on obtient 1 1

...EXPLICATION...

On peut augmenter le chiffre de l'unité  0  en le faisant juste passer au chiffre suivant :  1 .

Exemple 4 :

Si on rajoute 1 à 1 1
on obtient 1 0 0

...EXPLICATION...

On ne peut augmenter le chiffre du bit de poids faible qui est déjà à  1 .

On le passe donc à  0  ET on incrémente la case juste à gauche.


La case suivante était initialement à  1  : elle passe donc à  0  également et on va devoir augmenter de 1 la case suivante.


Le chiffre de la case la plus à gauche  0  passe donc à  1 .

02° Compléter la séquence de nombres binaires de  000  à  111  de façon à gagner 1 à chaque fois (vous pouvez modifier les valeurs dans les cases vides  ?  en cliquant dessus.

0 0 0
0 0 1
? ? ?
? ? ?
? ? ?
? ? ?
? ? ?
1 1 1

...CORRECTION...

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

2.3 Nombres de cas possibles

Si on possède une case  ?  à remplir, on peut donc définir 2 valeurs de  0  à  1 .

Comme le premier cas est numéroté 0, on a bien 1+1 = 2 valeurs possibles.

Si on dispose de 2 cases  ??  à remplir, on peut définir des valeurs de  00  à  11 .

Comme le premier cas est numéroté 0, on a bien 3+1 = 4 valeurs possibles :

  • Cas 0 :  00 
  • Cas 1 :  01 
  • Cas 2 :  10 
  • Cas 3 :  11 

Si on dispose de 3 cases  ???  à remplir, on peut définir des valeurs de  000  à  111 .

Comme le premier cas est numéroté 0, on a bien 7+1 = 8 valeurs possibles.

  • Cas 0 :  000 
  • Cas 1 :  001 
  • Cas 2 :  010 
  • Cas 3 :  011 
  • Cas 4 :  100 
  • Cas 5 :  101 
  • Cas 6 :  110 
  • Cas 7 :  111 

On voit bien qu'il y a une généralisation à trouver. Laquelle ?

Je vous laisse chercher un peu ...

Et la réponse est :

Nombre de cas dénombrables en base 2

En binaire, si on dispose de X bits pouvant accueillir 0 ou 1, le nombre de valeurs possibles est 2X.

Attention : dans la mesure où le premier cas est 0, la valeur maximale est donc 2X - 1

Exemple : si on dispose de 8 bits

  • Le nombre de possibilité est 28 = 256
  • On peut alors stocker des valeurs partant de 0 jusqu'à 255.

2.4 Bilan sur la base 2 (binaire)

Résumé binaire - base 2
  1. Que peut-on mettre dans les cases d'un nombre en base 2 ?
  2. Des chiffres. Chacun d'entre eux se nommant un bit. Combien et lesquels ?

    Base 2 donc 2 CHIFFRES :  0  ou  1 .

  3. On peut facilement trouver le poids des cases en utilisant les puissances de 2 :
  4. La case code 8 4 2  1 
    qu'on peut écrire sous la forme 23 22 21 20
  5. Méthode à utiliser pour incrémenter (rajouter 1)
    • Tenter de rajouter 1 dans la case de poids faible (celle de droite).
    • Si le bit est à  0 , on le place à  1 .
    • Si le bit est à  1 , il s'agit du dernier chiffre disponible. On replace donc le bit à  0  ET on rajoute  1  dans la case juste à gauche.

    Exemple avec 3 bits :

    • Cas 0 :  000 
    • Cas 1 :  001 
    • Cas 2 :  010 
    • Cas 3 :  011 
    • Cas 4 :  100 
    • Cas 5 :  101 
    • Cas 6 :  110 
    • Cas 7 :  111 
  6. Nombre de valeurs disponibles en base 2
  7. En binaire, si on dispose de X cases pouvant accueillir un bit, le nombre de valeurs possibles est 2X.

    Attention : dans la mesure où le premier cas est 0, la valeur maximale est donc 2X - 1

    Exemple : si on dispose de 8 bits

    • Le nombre de possibilité est 28 = 256
    • On peut alors stocker des valeurs partant de 0 jusqu'à 255 inclus.

4 - Octet

Et voici qu'on commence à comprendre pourquoi la commande de vitesse du robot ne pouvait aller que jusqu'à 255 : on stocke cette valeur sur un ensemble de 8 bits. On ne peut donc obtenir qu'une valeur comprise entre 0 et 255.

Définition : octet

Un octet est un ensemble de 8 bits successifs.

Puisqu'il contient 8 bits, un octet possède 28 soit 256 valeurs x différentes telles que 0 < x < 255.

Sous forme binaire, un octet est donc compris entre  0000 0000  et  1111 1111 .

En binaire, cela donne donc un entier compris entre  000  et  255 .

Partant d'un bit de poids faible valant 20, on obtient donc un bit de poids fort pesant 27, soit 128.

Poids1286432168421
Poids2726252423222120

Chaque valeur de l'octet peut ainsi représenter un cas particulier d'une information encodée sous la forme d'un nombre.

Si une information possède plus de 256 cas différents à encoder, il va nécessairement falloir l'encoder sur plus qu'un seul octet.


Voilà un exemple pour un nombre binaire de 8 bits (on appelle cela un octet), M =  1010 1011 .

Nombre M =10101011
Les bits codent 1286432168421
On obtient donc12832821

D'ou la valeur de M en base 10 : M = 128 + 32 +8 + 2 + 1 = 171.

On peut donc écrire que M = ( 171 ) 10 = ( 1010 1011 ) 2

Et un exemple de convertisseur automatique d'OCTET pour la forme :

Votre nombre binaire M :

Nombre M =
Les bits codent 1286432168421
On obtient donc

D'ou la valeur de M en base 10 : M = = .

5 - Exemples rapides d'utilisation de l'octet

La première utilisation de l'octet est bien entendu la mise en mémoire d'un nombre entier naturel jusqu'à 255 inclus.

Un autre exemple: l'encodage de caractères, par exemple l'encodage latin-9 qui permet de stocker des textes écrits dans un langage d'Europe de l'Ouest en représentant chaque lettre par un nombre compris entre 0 et 255.

En voici un court extrait :

_0_1_2_3_4_5_6_7_8_9
6_<=>?@ABCDE
7_FGHIJKLMNO
8_PQRSTUVWXY
9_Z[\]^_`abc
10_defghijklm
11_nopqrstuvw

On voit que le signe inférieur est encodé par le nombre 60, le A par le nombre 65, le a par 97 ...

Avec ce type d'encodage de caractères sur un octet, on ne peut donc représenter que 256 caractères différents.

Encodage

Retenez pour l'instant que l'encodage est une sorte de table permettant d'associer chacun des 256 caractères choisis à un nombre unique (compris entre 0 et 255).

Il en fallait plusieurs, presque un par langage du coup...

Seuls les 128 premières valeurs sont communes à quasiment toute les tables : il s'agit des 128 caractères ASCII. Ainsi A est toujours enregistré par la valeur65, la lettre B par la valeur 66 ...

Par contre, selon l'encodage la valeur 233 peut signifier é (en encodage latin-9 par exemple) ou Θ (en encodage cp850) ou encore È (en encodage mac-roman sur les Macs)...

Avec l'arrivée du Web, c'était devenu compliqué de faire communiquer des gens écrivant dans des langages différents. Sur les écrans, ça pouvait vite devenir n'importe quoi... Il a fallu trouver une autre solution : encoder les caractères sur plus d'un octet !

Nous en apprendrons plus pendant l'activité sur les encodages de caractères.

Un dernier exemple : l'encodage des couleurs. Voici les intensités de rouge pour des valeurs comprises entre 0 et 255. On ne prend pas plus de place qu'un octet car vous allez voir qu'on ne peut déjà pas distinguer des intensités de rouge de valeurs proches à l'oeil nu. Inutile donc de prendre deux octets pour faire cela.

ValeurVisuelValeurVisuelValeurVisuel
085170
186171
287172
388173
489174
590175
691176
792177
893178
994179
1095180
1196181
1297182
1398183
1499184
15100185
16101186
17102187
18103188
19104189
20105190
21106191
22107192
23108193
24109194
25110195
26111196
27112197
28113198
29114199
30115200
31116201
32117202
33118203
34119204
35120205
36121206
37122207
38123208
39124209
40125210
41126211
42127212
43128213
44129214
45130215
46131216
47132217
48133218
49134219
50135220
51136221
52137222
53138223
54139224
55140225
56141226
57142227
58143228
59144229
60145230
61146231
62147232
63148233
64149234
65150235
66151236
67152237
68153238
69154239
70155240
71156241
72157242
73158243
74159244
75160245
76161246
77162247
78163248
79164249
80165250
81166251
82167252
83168253
84169254
85170255

Nous retrouverons cette notion d'octets dans beaucoup d'activités. Nous verrons ainsi plus dans le détail l'encodage et la taille nécessaire pour placer en mémoire un texte, une image ou une vidéo.

6 - Sous-unités de l'octet

Il existe deux types de sous-unités de l'octet mais seul le premier est aujourd'hui couramment utilisé dans la description des produits.

Le premier utilise les notations standards, utilisées en sciences physiques par exemple :

Sous-unité Valeur en octetPourquoi ?
Un kilo (k) représente 103

soit 1 000

Un Méga (M) représente 106

soit 1 000 000

un millon, soit 1000 x 1 000
Un Giga (G) représente 109

soit 1 000 000 000

un milliard, soit 1000 x 1 000 000
Un Téra (T) représente 1012

soit 1 000 000 000 000

mille millards, soit 1000 x 1 000 000 000

On voit donc que chaque sous-unité représente 1000 fois plus que la précédente.

Ce système de notations n'est en place que depuis 1998. Auparavent, un ko représentait 1024 octets, comme dans le système présenté plus bas. En fonction des constructeurs et de l'age du produit, il est donc possible que la capacité de mémoire notée ne soit pas exactement celle constatée...

Le système précédent est basé sur la base 10. En informatique, on travaille en base 2 puisqu'on est en binaire. Il existe donc une façon plus 'naturelle' de définir les relations entre les unités. Naturelle pour un ordinateur, moins pour les humains...

Pour les distinguer des autres unités, on rajoute un i à la fin.

Sous-unité Valeur en octetPourquoi ?
Un kilo (Ki) représente 210

soit 1 024

Un Méga (Mi) représente 220

soit 1 048 576

Presque un million, 1024 x 1024
Un Giga (Gi) représente 230

soit 1 073 741 824

Presque un milliard, soit 1024 x 1 048 576
Un Téra (Ti) représente 240

soit 1 099 511 627 776

Presque mille millards, soit 1024 plus que 1 Gi

On voit donc que chaque sous-unité représente 1024 fois plus que la précédente.

Nous allons regarder un peu l'évolution des supports de stockage et en profiter pour faire des comparaisons et des convertions.

Nous allons comparer les systèmes sur le cas d'un livre de 200 000 caractères.

03° Calculer le nombre d'octets en octets (o), en ko et en Kio pour stocker ce livre d'exactement 200 000 caractères sous forme numérique, sans compression des données. Nous prendrons le cas hypothétique d'un caractère pour un octet. Donner ensuite le nombre de bits nécessaires.

...CORRECTION...

200 000 caractères donnent donc nbr_octets = 200 000 o.

Pour obtenir le poids en ko, il suffit de diviser ce nombre par 1000 :

nbr_octets = 200 000 / 1000, soit nbr_octets = 200 ko.

Pour obtenir le poids en Kio, il suffit de diviser ce nombre par 1024 :

nbr_octets = 200 000 / 1024, soit nbr_octets = 195.3125 Kio.

Comme un octet est composé de 8 bits, nous obtenons :

nbr_bits = 200 000 * 8, soit nbr_bits = 1 600 000 b.

On notera avec attention que la lettre de représentation de l'octet est un o minuscule et celle du bit un b minuscule également.

7 - Petit historique du stockage

La carte mère de votre ordinateur possède deux types de mémoire : la mémoire morte (fixée par le constructeur et permettant le démarrage et l'utilisation de l'ordinateur) et la mémoire vive (rapide d'accès mais qui disparait à chaque fois qu'on éteint le système). Ces deux mémoires ont une taille limitée et sont directement reliées à l'interne. Plus de détails sur ce thème dans la partie Architecture.

Si l'on veut stocker ou partager de grandes quantités de données, il faut donc un autre type de dispositif. Nous allons (un peu) parler de ces dispositifs dans cette partie.

La carte perforée (≈ 1930)

Cette carte est l'héritière des bandes perforées utilisées dans les métiers à tisser, les pianos et les orgues de Barbarie. Le créateur initial du système de bandes est le français Basile Bouchon, aux environs de 1725.

Les cartes perforées sont les premiers systèmes de mémoire de masse et de communication (entrée/sortie) qui ont été utilisés au début des systèmes informatiques.

Punched card
Carte perforée (Mutatis mutandis CC BY-SA sur Wikimedia)

En 1928, IBM dépose le brevet de la carte dite 80 colonnes qui sera la plus utilisée.

04° En considérant que :

  • on peut stocker 80 octets par carte (on notera qu'à l'époque le mot numérique comportait 12 bits et pas 8 en réalité, mais on va simplifier)
  • la vitesse de lecture est de 133 colonnes par seconde

Calculer le nombre de secondes nécessaires à la mise en mémoire du livre de 200 ko et le nombre de cartes nécessaires pour le stocker.

Chaque carte mesurant environ 19 cm, en déduire le nombre de mètres nécessaires.

Rappel : la taille du livre en mémoire est de 200 ko, soit 200 000 octets.

...CORRECTION...

Pour obtenir le nombres de secondes, il suffit de diviser le nombre d'octets par 133 :

duree = 200 000 / 133, soit duree = 1500 s avec 3 chiffres significatifs.

Pour l'obtenir en minutes, il suffit de diviser ce temps par 60 :

duree = 1500 / 60, soit duree = 25,0 min avec 3 chiffres significatifs.

Pour obtenir le nombres de cartes, il suffit de diviser le nombre d'octets par 80 :

nbr_cartes = 200 000 / 80, soit nbr_cartes = 2500 cartes !

longueur = 2500 * 0.19, soit longueur = 475 m !


La bande magnétique (≈ 1950)

En 1950, l'apparition de la bande magnétique va rapidement mettre le stockage précédent à la retraite. La bande magnétique n'existe plus dans l'informatique domestique mais reste encore très utilisée dans les centres de stockage professionnels.

Bande magnétique
Bande magnétique (CC BY-SA sur Wikimedia)

Il s'agit d'une bande plastique d'environ 1,5 cm de largeur sur laquelle on place une poudre d'oxyde de Fer (Fe2O3) qui a comme propriété de pouvoir rester aimantée une fois soumise à un champ magnétique. C'est ainsi qu'on créé le 1 et le 0 : en fonction de l'aimantation du petit secteur qu'on teste.

En 1951 l'UNIVAC était ainsi muni de bandes magnétiques.

Le principal désavantage par rapport aux disques magnétiques (disque dur) ? Il faut dérouler la bande pour arriver à l'endroit voulu. On dit que l'accès est séquentiel : il faut parcourir la bande dans l'ordre. Ca peut être très long si l'information voulue est plutot en fin de bande !

05° On considère une bande stockant 6250 bits per inch (bpi) (3 chiffres significatifs). Un inch correspondant à peu près à 2.5 cm (2 chiffres significatifs), calculer le nombre bpcm de bits par cm de bande. En déduire le nombre d'octets par cm.

...CORRECTION...

Il suffit de calculer ceci : bpcm = 6250 / 2.5.

On obtient donc bpcm = 2500 bits par cm de bande (avec 2 chiffres significatifs).

On divise par 8 les 2500 bits par cm de bande pour obtenir le nombre opcm d'octets par cm de bande.

opcm = 2500 / 8, soit

opcm = 310 octets par cm (2 chiffres significatifs).

06° En déduire la longueur de bande nécessaire pour stocker les 200 000 octets de notre fichier. Calculer ensuite le temps de lecture en considérant une vitesse de déroulement de 2,85 m.s-1.

...CORRECTION...

Pour trouver la longueur de la bande nécessaire en cm, on doit donc diviser le nombre d'octets à stocker par cette densité :

longueur = 200 000 / 310, soit

longueur = 650 cm = 6,5 m (2 chiffres significatifs).

Puisque la formule de la vitesse est v = d / t, on obtient :

v * t = d donc

t = d / v = 6.5 / 2.85

t = 2.3 s (2 chiffres significatifs)

Vous devriez avoir trouvé moins de 3s avec la bande magnétique pour 25 minutes pour les bandes perforées. Bien entendu, on considère ici qu'on est précisement au début de l'enregistrement, donc on triche un peu. Et les caractéristiques ne correspondent pas non plus au tout début de cette technologie où la vitesse de lecture était bien plus faible. Mais on voit bien l'évolution.

L'une des versions grand public de cette technologie est bien entendu la cassette, avant l'arrivée de la disquette puis du dvd, de la clé USB, du disque dur portable et de la carte SD :

Lecteur cassette
Lecteur de cassette (D-Kuru CC BY-SA 3.0 sur Wikipedia)

En 2019, on trouve maintenant des bandes permettant de stocker 1,6 To à la vitesse de 240 Mo.s-1.

La bande magnétique reste une référence en terme d'archivage de données car elle est moins chère que le support disque. En effet, avec un même lecteur vous pouvez lire une multitude de bandes. Alors que lorsqu'on achête un disque, on achète dans le bloc à la fois le support ET le lecteur. Autre avantage non négligeable : les erreurs d'écriture (un 0 qui se transforme en 1 ou inversement) sont 1000 fois moins nombreuses sur bande magnétique. C'est pour ses raisons que les grosses entreprises préfèrent archiver sur des bandes que sur des disques.

07° Calculer le temps de lecture du livre de 200 ko avec cette nouvelle vitesse.

...SANS PUISSANCE DE 10...

Sans puissance de 10 :

taille = 200 000 o = 200 000 / 1000 = 200 ko

vitesse = 240 Mo.s-1 = 240 * 1000 = 240 000 ko.s-1

En utilisant les unités, on voit qu'on peut écrire vitesse = taille / durée. On en déduit que :

temps = taille / vitesse = 200 / 240 000 soit

temps = 0.000833 s

Le 0 mis en valeur est à la 3e position après la virgule. On peut donc écrire :

temps = 0.833 ms

...AVEC PUISSANCE DE 10...

Avec puissance de 10 :

taille = 200 000 o = 200 ko = 200 x 103 o

vitesse = 240 Mo.s-1 = 240 x 106 o.s-1

En utilisant les unités, on voit qu'on peut écrire vitesse = taille / durée. On en déduit que :

temps = taille / vitesse = 200E3 / 240E6 sur votre calculatrice ou sur le Shell Python, soit

temps = 0.000833 s

Le 0 mis en valeur est à la 3e position après la virgule. On peut donc écrire :

temps = 0.833 x 10-3

temps = 0.833 ms

08° Combien de livres de 200 ko peut-on placer sur un support de 1,6 To ?

...SANS PUISSANCE DE 10...

Sans puissance de 10 :

On place les deux tailles dans la même unité, le Mo par exemple.

taille_livre = 200 ko = 0,2 Mo

taille_support = 1,6 To = 1 600 Go = 1 600 000 Mo

Pour connaitre le nombre de livres stockables, on divise la taille du support par la taille d'un livre, les tailles étant données dans la même sous-unité :

nombre = taille_support / taille_livre = 1 600 000 / 0,2 soit

nombre = 8 000 000

On peut donc stocker 8 millions d'exemplaires de ce livre.

...AVEC PUISSANCE DE 10...

Avec puissance de 10 :

taille_livre = 200 ko = 200 x 103 o

taille_support = 1,6 To = 1,6 x 1012 o

Pour connaitre le nombre de livres stockables, on divise la taille du support par la taille d'un livre, les tailles étant données dans la même sous-unité :

nombre = taille_support / taille_livre = 1.6E12 / 200E3 soit

nombre = 8 000 000

On peut donc stocker 8 millions d'exemplaires de ce livre.


Le disque dur (hard drive) (≈ 1955)

Nous restons sur un principe de fonctionnement électro-magnétique avec stockage magnétique.

Comme pour les bandes magnétiques :

  • écriture : on crée un courant électrique qui modifie les propriétés magnétiques de la partie voulue du disque.
  • lecture : on détecte les propriétés magnétiques de la zone voulue du disque car lorsque la tête de lecture passe au dessus, il y a création d'un courant électrique (état 1) ou non (état 0)

La différence fondamentale ? Cette façon fois, il ne s'agit pas de bandes mais de disques qui tournent. Les disques sont en verre ou en céramique et sont recouverts d'une couche magnétique. L'information est repartie par secteur sur tout le disque : pour atteindre la zone voulue, il suffit donc au pire d'attendre que le disque ai fait un tour. Plus besoin de lire séquentiellement.

Un des disques d'un disque dur
Principe d'un disque (Stéphane CC BY-SA 3.0)

En 1956, la société IBM crée un premier disque dur de 5 Mo.

En 2019, on trouve des modèles allant jusqu'à 16 To avec une vitesse de 200 Mo.s-1.

09° Calculer le temps de lecture de notre fichier de 200 ko sur un tel disque dur.

...AVEC PUISSANCE DE 10...

Avec puissance de 10 :

taille = 200 000 o = 200 ko = 200 x 103 o

vitesse = 200 Mo.s-1 = 200 x 106 o.s-1

temps = taille / vitesse = 200E3 / 200E6 sur votre calculatrice ou sur le Shell Python, soit

temps = 0.001 s = 1 ms

10° Combien de livres de 200 ko peut-on placer sur un support de 16 To ?

...AVEC PUISSANCE DE 10...

Avec puissance de 10 :

taille_livre = 200 ko = 200 x 103 o

taille_support = 16 To = 16 x 1012 o

Pour connaitre le nombre de livres stockables, on divise la taille du support par la taille d'un livre, les tailles étant données dans la même sous-unité :

nombre = taille_support / taille_livre = 16E12 / 200E3 soit

nombre = 80 000 000

On peut donc stocker 80 millions d'exemplaires de ce livre.

C'est à partir des années 1990 que le prix et la taille des disques durs leur permettent d'être présents dans tous les ordinateurs personnels. Et à l'époque, les disques durs étaient internes. Pour transporter un programme ou des informations d'un ordinateur à l'autre, il fallait donc autre chose... Internet n'était pas présent partout, alors on utilisait des disquettes.


Le floopy disk ou disquette (disque souple) (≈ 1970)

Une petite révolution cette disquette : dès les années 1960 (et avant la démocratisation des disques durs) on cherche à remplacer le disque dur par un système moins cher et moins lourd.

En 1967, IBM crée la première disquette, capable de contenir environ 80 000 caractères. Elle devait permettre par exemple de transmettre des mises à jour sans Internet. Peu à peu, la disquette remplacera la bande perforée.

Une disquette en vision par couche
Disquette (image en domaine public)

Les dernières générations avaient des caractéristiques de l'ordre de 2 880 Kio et 125 ko.s-1.

11° Combien de livres de 200 ko peut-on placer sur un support de 2 880 Kio ? Attention à l'unité : 1 Kio = 1024 o.

...CORRECTION...

taille_livre = 200 ko = 200 x 1000 = 200 000 o

taille_support = 2 880 Kio = 2880 x 1024 = 2 950 000 o (3 chiffres significatifs)

Pour connaitre le nombre de livres stockables, on divise la taille du support par la taille d'un livre, les tailles étant données dans la même sous-unité :

nombre = taille_support / taille_livre = 2950000 / 200000 soit

nombre = 14.8

On peut donc stocker 14 exemplaires de ce livre.

Belle révolution qui a permis le transfert d'informations de façon aisée. Mais la disquette n'a pas survecu à la démocratisation des disques (CD, DVD, Blueray), d'Internet, des disques durs externes puis des clés USB.


Les disques CD(≈ 1980) - DVD(≈ 2000) et Blu-ray(≈ 2010)

Il s'agit de dispositifs optiques.

Les CD peuvent stocker 700 Mo et lire à la vitesse de 8 Mo.s-1.

Les DVD lisent à la même vitesse mais stockent jusqu'à 8,5 Go, .

12° Combien de CD peut-on mettre sur un DVD ?

...CORRECTION...

taille_cd = 700 Mo

taille_dvd = 8,5 Go = 8500 Mo

nombre = taille_dvd // taille_cd = 8500 / 700 soit

nombre = 12

On peut donc stocker le contenu de 12 CD sur un seul DVD.


Avec les puissances de 10, ça donne :

taille_cd = 700 Mo = 700 x 106

taille_dvd = 8,5 Go = 8.5 x 109

nombre = taille_dvd // taille_cd = 8.5E9 / 700E6 soit

nombre = 12


Pour le Blu-ray, on gagne en taille mémoire et en rapidité : une capacité de 128 Go et une vitesse de 128 Mo.s-1. Ils sont donc plus de 15 fois plus rapides que les deux autres systèmes.

Mémoires Flash : cartes(≈ 1990) et USB(≈ 2000)

Avec ces dispositifs, on change de technologie : jusqu'à présent, on avait un stockage de masse magnétique avec partie mécanique mobile pour enrouler ou faire tourner.

La technologie Flash est basée sur l'utilisation de transistors MOS, il s'agit donc d'un stockage purement électronique, sans aucune partie mobile.

La plupart des clés USB et les cartes SD sont issues de cette technologie.

usb
Interieur d'une clé USB (image libre de droit, Wikipedia)

Ces dispositifs sont extrémement pratiques car on peut en trouver une grande variété en terme de taille de stockage : de quelques centaines de Mo à 1 To.

Attention aux bonnes affaires apparentes : pensez toujours à vérifier la vitesse de lecture et d'écriture. Avoir une clé de grande capacité c'est bien. S'il faut 9 jours pour la remplir, c'est nettement moins pratique !

La plus rapide des clés USB 2.0 peut avoir une vitesse maximale de 25 Mo.s-1.

La plus rapide des clés USB 3.0 peut avoir une vitesse maximale de 300 Mo.s-1.

Les clés USB 3.1 peuvent elles monter à 1.25 Go.s-1.

Attention néanmoins : pour pouvoir utiliser la pleine puissance de votre clé 3.0, encore faut-il que vous la branchiez sur un port USB 3.0. Si le port USB est juste compatible USB 2.0, vous n'aurez que la vitesse du 2.0.

On trouve également des objets ayant la forme d'une clé USB mais contenant plutôt un mini disque dur. On parle alors de flash disk, de microdrive ou de disque dur externe.

Les hackers ont su depuis longtemps profiter de l'attrait de la clé USB. On peut y mettre ce qu'on veut et lancer des programmes automatiquement lorsqu'on connecte la clé sur un ordinateur. Sachant que la difficulté n°1 est d'infecter un premier ordinateur lorsqu'on veut rentrer illégalement sur un réseau, l'arnaque consiste à laisser par terre une clé USB infectée du virus voulu. Qui peut résister et tenter de voir à qui appartient la clé ? Rajoutez une petite étiquette intrigante et vous êtes presque certain que quelqu'un finira par brancher la clé sur son ordinateur. Le facteur humain est souvent le point faible du réseau informatique !

On retiendra qu'il existe une multitude de support et surtout que les performances (taille mémoire ou vitesse) vont souvent évoluer avec le temps. Il est donc souvent un peu illusoire de vouloir vraiment réaliser des tableaux comparatifs, à moins de le faire évoluer dans le temps.

L'un des aspects non évalués ici est par exemple le cout de la mémoire. Dans ce cas, on se rend compte que (en 2019), il est plus rentable d'acheter un disque dur externe qu'une clé USB si on désire une capacité de stockage de 1 To.

Un autre élément important : la différence entre la vitesse d'écriture et la vitesse de lecture du support ou la durée de vie.

Pour rappel final :

Sous-unité Valeur en octetPourquoi ?
Un kilo (k) représente 103

soit 1 000

Un Méga (M) représente 106

soit 1 000 000

un millon, soit 1000 x 1 000
Un Giga (G) représente 109

soit 1 000 000 000

un milliard, soit 1000 x 1 000 000
Un Téra (T) représente 1012

soit 1 000 000 000 000

mille millards, soit 1000 x 1 000 000 000

Dans la prochaine activité, nous verrons avec plus de précision comment coder les entiers (même les négatifs) ou les flottants.

En tous cas, vous avez sans doute compris pourquoi les fournisseurs d'accès à Internet donnent leurs vitesses de connexion en bits par seconde plutôt qu'en octets par seconde : ca leur permet d'afficher des résultats 8 fois plus grands, sans mentir en plus.

Activité publiée le 28 08 2019
Dernière modification : 29 09 2019
Auteur : ows. h.