Académique Documents
Professionnel Documents
Culture Documents
Dans l’ordinateur, toutes les informations (données ou programmes) sont représentées à l’aide
de deux chiffres 0 et 1, appelés chiffres binaires, ou binary digits ou plus simplement bits.
Dans la mémoire de l’ordinateur, ces chiffres sont regroupés par paquets de 8 appelés octets
(bytes en anglais) puis organisés en mots machine de 2, 4 ou 8 octets (words en anglais). Par
exemple, une machine dite 64bits est une machine qui manipule directement des mots de 8
octets ( 8×8 bits=64 bits ) lorsqu’elle effectue des opérations en mémoire.
Ce regroupement des bits en octets ou mots machine permet de représenter et manipuler
d’autres données que des 0 ou des 1, comme par exemple des entiers, des approximations de
réels, des caractères alpha-numériques ou des textes. Pour cela, il est nécessaire d’inventer des
encodages, c’est-à-dire des manières de représenter l’information.
I – Entiers naturels ( ℕ )
On appelle binaire pur le codage dans lequel sont écrit les entiers naturels
Il s’agit simplement de stocker le code binaire dans un nombre donné d’octets.
1.1 Addition
La règle d’or pour additionner en binaire est de retenir que 1 + 1 = 10, ce qui génère une
retenue dans les additions posées :
010 1011
+ 000 1010
En Python, les entiers sont illimités : on pourra donc écrire n’importe quelle séquence de
chiffres, Python adaptera la taille mémoire nécessaire.
1
Cours Encodages NSI
1.3 Boutisme
La représentation en machine des entiers naturels sur des mots de 2, 4 ou 8 octets se heurte au
problème de l’ordre dans lequel ces octets sont organisés en mémoire. Ce problème est appelé
boutisme, et il existe deux types d’organisation mémoire que nous illustrerons avec le mot de 4
octets 4CB6072F :
• le gros-boutisme (big endian) qui consiste à placer l’octet de poids fort en premier, c’est-à-
dire à l’adresse mémoire la plus petite.
• le petit-boutisme (little endian) qui consiste à placer l’octet de poids faible en premier.
Cette représentation petit ou gros boutiste est en principe transparente à l’utilisateur puisque gérée
par le système d’exploitation (operating system ou OS). Elle prend de l’importance quand on
accède aux octets soit en mémoire, soit lors d’échanges sur un réseau.
Les deux modes de représentation sont très répandus et leurs avantages et inconvénients sont
multiples. Par exemple, la lisibilité pour un humain est meilleure en gros-boutiste tandis que les
opérations arithmétiques se font plus facilement en petit-boutiste.
Anecdote
Le terme Big-Endians et Little-Endians provient du conte « Les voyages de Gulliver » de
Jonathan Swift, dans lequel de nombreux habitants de Lilliput refusent d’obéir à un décret
obligeant à manger les œufs à la coque par le petit bout. La répression pousse les rebelles, dont
la cause est appelée Big-Endian, à se réfugier dans l’empire rival de Blefuscu, ce qui
provoquera une guerre longue et meurtrière entre les deux empires.
A la fin des années 70, la « guerre sur l’ordre des octets » entre les partisans des deux camps est
à son apogée au moment de la construction des protocoles réseau qui donneront naissance à
l’internet. En 1980, Dany Cohen publie sur le site de l’Internet Engineering Task Force
(https://www.ietf.org/rfc/ien/ien137.txt) une note très ironique « On Holy Wars and a plea for
peace » dans lequel il nomme chaque partie les Big-Endians et les Little-Endians en référence
au roman, soulignant qu’avoir raison importe peu à présent, mais il faut faire un choix unique
pour les protocoles réseau.
Les noms de Big-Endian et Little-Endian deviennent ainsi les noms officiels des deux parties,
et on finira par s’accorder sur le fait que l’ordre des octets lors des échanges réseau est
Big-Endian.
II - Entiers relatifs ( ℤ )
On appelle binaire signé le codage dans lequel sont écrit les entiers relatifs
Les nombres signés utilisent le bit de poids fort (ou MSB pour Most Significant Bit) comme bit
de signe. Et utilisent le postulat suivant :
- si le bit de poids fort est égal à 0 alors le nombre est positif ou nul
- si le bit de poids fort est égal à 1 alors le nombre est négatif.
2
Cours Encodages NSI
Exemple : calculons l’opération 10 + (-10) en binaire signé
10 ⟶0000 1010
-10 ⟶1000 1010
⟶
Conclusions :
1. Le binaire signé ne permet pas de faire directement des additions.
2. De plus, ce codage produit deux valeurs pour 0 → 0000 0000 et -0 → 1000 0000
3
Cours Encodages NSI
2.2 Applications
- Déterminer l’écriture de -1, -127 et -128 puis compléter le tableau ci- Complément à 2
contre.
0111 1111 + 127
0000 0000 + 0 !!
-1
-2
2.4 En python
4
Cours Encodages NSI
III – Nombres flottants
Après les entiers relatifs, nous allons voir comment on représente une approximation des nombres
réels en machine, appelée nombres flottants.
3.1 Rappels
x
Un nombre décimal est un nombre s’écrivant sous forme de fraction décimale, c’est-à-dire n
10
où x est un entier relatifs (et n un entier naturel).
13
Exemple : =
4
Certains nombres réels ne sont pas décimaux, ils ont une forme décimale « approchée » :
1 333 314
≈ π≈
3 10³ 10²
3.2 Nombres dyadiques
Par analogie avec les nombres décimaux, on appelle nombres dyadiques les nombres qui
x
s’écrivent sous la forme n
où x ∈ℤ et n∈ℕ
2
13
Exemple : =
4
x
Pour obtenir le développement dyadique d’un nombre dyadique n
, on prend le binaire
2
correspondant à x et on insère une virgule avant le n-ième bit en partant de la fin.
10 2
Exemple : 13 =1101
13 2
Le développement dyadique de 2
est donc 11,01
2
13 1 0 −1 −2
Cela signifie que =1×2 +1×2 +0×2 +1×2
4
Il existe des nombres décimaux qui ne sont pas dyadiques et n’admettent donc pas de
développement dyadique fini.
10 2
Exemple : 0,1 =0,00011001100110011001100110011. ..
Par conséquent, leur représentation en machine sera nécessairement tronquée, et cela engendrera
des erreurs dans les opérations.
En python :
5
Cours Encodages NSI
6
Cours Encodages NSI
3.4 binaire vers décimal
Comme toujours pour la conversion en décimal, on calcule les puissance de 2
Exemple : Donner la valeur décimale de 100,0101
Pour la partie entière, nous obtenons …………...
Pour la partie décimale 0 x 2-1 + 1 x 2-2 + 0 x 2-3 + 1 x 2-4 = 0,25 + 0,0625 = 0,3125.
100,0101 représente le nombre décimal 4,3125
3.5 Python
Quand on tape :
>>> type(1/3)
on obtient :
<class ‘float’>
Pour les raisons d’approximation que nous avons vues précédemment, il faudra éviter les tests
d’égalité entre deux flottants
Ce qui signifie que pour Python, la représentation binaire du résultat de 0,1 + 0,2 n’est pas identique
à celle du nombre 0,3
3.6 Puissances de 2
En base dix, il est possible d'écrire les très grands nombres et les très petits nombres grâce aux
"puissances de dix" :
23 −11
exemples : " 6,02.10 " ou " 6,67.10 "
Il est possible de faire exactement la même chose avec une représentation binaire, puisque nous
sommes en base 2, nous utiliserons des "puissances de deux" à la place des "puissances dix".
L’exposant sera noté en binaire.
10
exemple : " 101,1101.2 "
ici le 2 est à la puissance ………
Pour passer d'une écriture sans "puissance de deux" à une écriture avec "puissance de deux", il
11
suffit décaler la virgule : " 1101,1001=1,1011001.2 "
nous avons décalé la virgule de ….. rangs vers la gauche
…….
on multiplie donc par " 2 "
Si l'on désire décaler la virgule vers la droite, il va être nécessaire d'utiliser des "puissances de deux
négatives"
……….
exemple : " 0,0110=1,10.2 " l’exposant est ici donné avec son écriture
nous décalons la virgule de 2 rangs binaire précédé de son signe + / -
vers la droite, d'où l’exposant ….
7
Cours Encodages NSI
Nous pouvons vérifier que l'on a bien 1 + 8 + 23 = 32 bits pour la simple précision et 1 + 11 + 52 =
64 bits pour la double précision.
8
Cours Encodages NSI
Remarques :
• On complète la mantisse avec des zéros à droite car il s’agit d’une partie fractionnaire pour
laquelle les zéros à droite sont des zéros inutiles (on complète pour arriver à 23 bits en
simple précision)
• On complète l’exposant qui est un entier avec des zéros à gauche (pour arriver à 8 bits en
simple précision)
• Pour le format double précision le décalage est de 1023 (il faut systématiquement ajouter
1023 à l'exposant afin d'obtenir uniquement des valeurs positives)
2/ Donner la valeur décimale du nombre suivant encodé avec la norme IEEE 754
1 10000110 10101000000000000000000
9
Cours Encodages NSI
10
Cours Encodages NSI
IV – Codage des caractères
Nous savons qu'un ordinateur est uniquement capable de traiter des données binaires.
C’est donc aussi sous ce format que seront codés les textes (ou caractères)
4.1 ASCII
Avant 1960 de nombreux systèmes de codage de caractères existaient, ils étaient souvent
incompatibles entre eux. En 1960, l'organisation internationale de normalisation (ISO) créé la
norme ASCII (American Standard Code for Information Interchange). À chaque caractère est
associé un nombre binaire sur 8 bits (1 octet). En fait, seuls 7 bits sont utilisés pour coder un
caractère, le 8e bit n'est pas utilisé pour le codage des caractères. Avec 7 bits, il est possible de coder
jusqu'à 128 caractères ce qui est largement suffisant pour un texte écrit en langue anglaise (pas
d'accents et autres lettres particulières).
La page Wikipedia contient la liste des codes ASCII : Comme vous pouvez le constater dans ce
tableau, le caractère "A" majuscule correspond au code binaire 1000001, ou 65 en décimal ou 41 en
hexadécimal
Tableau de conversion
Le tableau ci-dessous permet de :
• trouver le code binaire,
décimal et hexadécimal
d’un caractère ASCII.
• Trouver le caractère ASCII
correspondant à un code
sur 7 bits.
• Convertir en base 2, 10 ou
16 les nombres compris
entre 0 et 127.
exemples :
10
« G » sera codé 71
16
(64+7) en décimal, 47 en
2
hexadécimal et 1000111 en
binaire
10
le nombre 99 (96+3)
16 2
s’écrit 63 ou 1100011 .
En ASCII, il code le « c »
11
Cours Encodages NSI
Exercice : Quel est le code binaire du "a" minuscule en ASCII ?
Et le code hexadécimal du point d’exclamation ?
12
Cours Encodages NSI
4.3 ISO-8859-1
La norme ASCII convient bien à la langue anglaise, mais pose des problèmes dans d'autres langues,
par exemple le français. En effet l'ASCII ne prévoit pas d'encoder les lettres accentuées. C'est pour
répondre à ce problème qu'est née la norme ISO-8859-1. Cette norme reprend les mêmes principes
que l'ASCII, mais les nombres binaires associés à chaque caractère sont codés sur 8 bits, ce qui
permet d'encoder jusqu'à 256 caractères. Cette norme va être principalement utilisée dans les pays
européens puisqu'elle permet d'encoder les caractères utilisés dans les principales langues
européennes (la norme ISO-8859-1 est aussi appelée "latin1" car elle permet d'encoder les
caractères de l'alphabet dit "latin")
Malheureusement, il existe beaucoup d'autres langues dans le monde qui n'utilisent pas l'alphabet
dit "latin", par exemple le chinois ou le japonnais ! D'autres normes ont donc dû voir le jour, par
exemple la norme "GB2312" pour le chinois simplifié ou encore la norme "JIS_X_0208" pour le
japonais.
Cette multiplication des normes a très rapidement posé problème. Imaginons un français qui parle le
japonais. Son traitement de texte est configuré pour reconnaître les caractères de l'alphabet "latin"
(norme ISO-8859-1). Un ami japonais lui envoie un fichier texte écrit en japonais. Le français devra
modifier la configuration de son traitement afin que ce dernier puisse afficher correctement
l'alphabet japonais. S'il n'effectue pas ce changement de configuration, il verra s'afficher des
caractères ésotériques.
4.4 Unicode
Pour éviter ce genre de problème, en 1991 une nouvelle norme a vu le jour : Unicode ou UCS en
anglais.
Unicode a pour ambition de rassembler tous les caractères existant afin qu'une personne utilisant
Unicode puisse, sans changer la configuration de son traitement de texte, à la fois lire des textes en
français ou en japonais.
Unicode est une table associant un caractère (lettre, nombre, idéogramme etc.), un nom unique (sa
description), et un numéro appelé point de code.
On utilise la notation U+xxxx pour désigner les points de code, où chaque x est un chiffre
hexadécimal. Par exemple, U+006F désigne la caractère o (111 en décimal).
Il existe plusieurs formats pour encoder les caractères Unicode en machine : UTF-8, UTF-16 et
UTF-32. Le plus utilisé, notamment sur Linux, les protocoles réseaux et le Web, est UTF-8.
Pour encoder les caractères Unicode, UTF-8 utilise un nombre variable d'octets : les caractères
simples (présents dans la norme ASCII) sont codés sur un octet, alors que des caractères "moins
classiques" sont codés sur un nombre d'octets plus important, jusqu'à 4 octets. Un des avantages
d'UTF-8 c'est qu'il est totalement compatible avec la norme ASCII : Les caractères Unicode codés
avec UTF-8 ont exactement le même encodage que les mêmes caractères en ASCII.
13
Cours Encodages NSI
4.5 Unicode et Python
Les chaînes de caractères en Python sont des séquences de caractères au format UTF-8. Ces
caractères peuvent être saisis avec à l’aide d’une séquence d’échappement \u suivi du point de code
en hexadécimal.
De manière générale, seuls les caractères non ASCII sont donnés en hexadécimal, les autres étant
simplement affichés comme des caractères.
A noter ci-contre :
1. les lettres o, n et u sont affichés comme des caractères dans la
chaîne d’octets m
2. la méthode encode() s’applique à un type chaine de caractère
<class ‘str’> et renvoie une chaîne d’octet
<class ‘bytes’> alors que la méthode decode()
s’applique à un type chaîne d’octet et renvoie une chaîne de
caractères.
3. len(l) renvoie la longueur de la chaîne de caractère l, soit 7
4. len(m) renvoie la longueur de la chaîne d’octets m, soit 10
Il faut donc 10 octets pour encoder la chaine l en UTF-8
14