BITS, OCTETS, CARACTÈRES
Jean-François Perrot,
Professeur émérite, Université Pierre et Marie Curie
Octobre 2005, révisé en octobre 2006 et en octobre 2007
I - Introduction : Utilité de comprendre ces notions.
II - Messages, structure et contenu
a) Nature des messages, exemples
b) Signification, contenu d'un message
c) La loi fondamentale
III - L'unité de mesure : le bit
a) Abstraction
b) Le message élémentaire binaire
c) Interprétation numérique
IV - Mots et Octets
a) Influence de la longueur des mots. Bytes
b) Longueurs puissances de 2. Octets
c) Notations : binaire, octal, hexadécimal
V - Codage des caractères. Le code ASCII
a) Taille de l'alphabet et nombre de bits
b) Structure du code ASCII
c) Note sur la représentation du saut de ligne
I - Introduction : Utilité de comprendre ces notions.
Les concepts de quantité d'information et d'unité pour la mesurer
doivent faire partie du bagage intellectuel des hommes d'aujourd'hui.
La révolution que l'Informatique opère dans les sociétés
modernes est fondée sur le caractere protéiforme
(ou complètement banal, si on préfère)
de l'information : celle-ci apparaît comme une grandeur
mesurable, qui persiste à travers de multiples changements d'aspect
(à l'instar de l'énergie), sans être rien en elle-même,
sauf une abstraction.
D'autre part, la réalité observable dans l'informatique
de tous les jours est le produit de contingences d'ordres très
différents,
et il est utile d'avoir quelques éléments de technique pour discerner
l'essentiel de l'accessoire : on doit distinguer
- les nécessités "physiques" (nature de l'information),
- les pesanteurs "techniques"
(choix de l'octet pour coder les caractères),
- les choix "industriels" (production
de machines à 8, 16 ou 32 bits, bientôt 64 bits ; émergence du réseau)
- et les facteurs commerciaux et socio-politiques
(fournisseurs plus ou moins compétents).
Nous espérons apporter ici quelques
éclaircissements, au moins en ce qui concerne les deux
premiers points.
L'exposé est en 4 parties :
(1) nous mettrons d'abord en évidence
une notion de "message"; et nous définirons le contenu
(informatif) d'un message ;
(2) nous introduirons ensuite le "bit",
unité de mesure de cette information ;
(3) ces bits devront
s'organiser en "mots", plus particulièrement
en mots de 8 bits ou "octets" ;
enfin (4), nous appliquerons ces considérations
au codage de base des caractères latins (code ASCII).
II - MESSAGES : STRUCTURE ET CONTENU
Les messages dont nous parlons ici sont réduits à leur
plus simple expression.
Nous les appelons messages parce qu'ils transportent de l'information (concept devant être défini), et qu'ils sont sujets à différents codages.
Le phénomène nouveau
qui attire l'attention sur eux est que les ordinateurs traitent "tout"
comme des messages de ce genre,
c'est à dire que les ordinateurs ne voient le monde que sous l'aspect d'une information codée : un message.
a) Nature des messages, exemples :
Nos messages sont essentiellement
des chaînes de caractères.
Plus généralement, des chaînes
de "messages élémentaires".
Leur
propriété essentielle est de pouvoir
se décomposer en "sous-messages", chaque message étant
produit par l'enchaînement (ou concaténation) de ses sous-messages.
Ce sont donc des structures à une seule dimension,
orientée de gauche à droite, perçue comme le support
d'une lecture.
Exemples :
- les numéros minéralogiques
des automobiles
forment une classe de messages familiers, qui se
décomposent (pour la France) en trois sous-messages
:
une suite de chiffres, une suite de lettres, une suite de deux
chiffres (si on ne prend pas en compte l'exception des deux
départements corses).
- les numéros de téléphone, les
numéros de sécurité sociale, les matricules de
toute sorte
sont autant d'espèces de messages, formés
exclusivement de chiffres
(encore que les numéros
de téléphone aient aussi contenu des lettres il n'y a pas si
longtemps).
- les cotes de bibliothèque sont des messages aux structures
variées :
indications de fonds, de format,
de date, de contenu, d'auteur, de numéro d'ordre, dont chacune est
à considérer comme un message élémentaire.
Le lecteur n'aura pas de peine à
allonger cette liste, peut-être avec un pincement de cœur,
et en trouvant que les sociétés modernes tendent trop
à remplacer les gens par des numéros...
b) Signification, contenu d'un message :
Nous considérons nos messages d'un point
de vue résolument utilitaire, en admettant qu'ils servent exclusivement à
effectuer des choix :
la signification d'un message sera le choix qu'il permet
de faire entre différentes éventualités, lesquelles étaient
définies avant sa réception.
Pour reprendre une heureuse formulation de Rabardel, "le sens
précède le message, il n'est pas produit par l'ordinateur
et n'en relève nullement"
[in Les Hommes et les Technologies, Approche Cognitive des Instruments Contemporains, Armand Colin 1995, p. 45].
Par exemple :
la donnée d'un numéro minéralogique
permet de choisir une voiture parmi toutes celles
qui sont immatriculées dans le pays considéré,
celle d'une
cote dans la bibliothèque X conduit
à obtenir un ouvrage parmi ceux qui sont disponibles dans cette bibliothèque,
etc.
A priori, rien de commun entre une voiture
et un livre, et il n'y a pas de comparaison entre le choix de
l'une et la sélection de l'autre.
Pourtant, il est raisonnable de
considérer que le choix est d'autant plus "difficile" que le nombre
de possibles est plus grand,
et d'estimer, par conséquent, que le message
qui l'a permis est d'autant plus "important".
On
comparera donc le nombre de voitures immatriculées
et le nombre de livres dans la bibliothèque, pour conclure que
la plaque "disait plus de choses" que la cote (ou vice-versa, suivant le pays d'immatriculation et la bibliothèque).
C'est ici que commence notre histoire...
Pour systématiser cette idée
de l'"importance" des messages, disons que le contenu
d'un message est mesuré par le nombre d'éventualités
entre lesquelles il permet de choisir.
Ainsi, le contenu d'un numéro de Sécurité Sociale
français est plus grand que celui d'une plaque minéralogique française,
puisqu'il permet
de choisir parmi tous les Français, qui sont plus
nombreux que leurs voitures (est-ce bien certain ?).
Comme on le voit, le contenu est le même
pour tous les messages d'une même espèce (tous les numéros
de S.S. ont le même contenu,
puisqu'ils permettent de sélectionner
un individu dans la même population).
Ou tout au moins,
le même pour toute une sous-espèce :
le contenu d'une plaque minéralogique
du département de la Creuse est moindre que celui d'une
plaque parisienne,
vu la différence du nombre de voitures concernées
(ceci suppose que les deux derniers chiffres ne sont pas pris en compte dans
l'analyse du contenu).
On peut également voir ce contenu
comme le nombre de messages différents appartenant à
l'espèce en question :
le nombre d'individus doit être égal
au nombre de messages,
puisque chaque message spécifie
un choix dans la population concernée,
et que chaque individu de ladite population est éligible (sans quoi on
ne le compterait pas).
L'essentiel, c'est que le contenu d'un
message ne dépend pas du message particulier envisagé,
mais seulement de sa composition, de sa structure.
Tous les messages
ayant la même structure (p.ex. 4 chiffres, 3 lettres, 2 chiffres)
ont le même contenu, quel que soit par ailleurs le domaine
de leur compétence.
Ce point est essentiel, nous allons le développer.
c) La loi fondamentale :
Si un message M est obtenu en enchaînant deux sous-messages P
et Q ,
alors son contenu est le produit (arithmétique) des contenus de P
et de Q .
Pour le voir, il suffit d'analyser le processus de choix à partir
d'un message.
Chaque élément du message
permet un choix partiel, et le choix final est la composition de
ces choix partiels.
Plus précisément, soit un message M formé de
deux sous-messages successifs M' et M", et m l'individu qu'il désigne au sein de la population concernée.
le fait que le premier sous-message M' donne une information
incomplète, insuffisante pour déterminer m complètement
(puisqu'on a besoin de M" ensuite) peut se mathématiser comme suit.
On considère la relation d'équivalence E ainsi définie sur la population visée
:
deux individus p et q sont équivalents s'ils
correspondent à deux messages Mp et Mq qui ont en commun le
premier sous-message M' et ne se différencient que par leurs seconds
sous-messages M"p et M"q respectivement, c'est-à-dire si Mp = M'+M"p
et Mq = M'+M"q en notant "+" la concaténation des messages.
On peut alors analyser la sélection de l'élément
m désigné par M en deux temps. D'abord le premier sous-message
M' permet de repérer non pas m lui-même, mais seulement sa classe
d'équivalence modulo E (on dirait en langage courant que m est déterminé
non pas exactement, mais à l'équivalence E près). Ensuite,
le deuxième sous-message M" permet de repérer m dans sa classe.
Soient K' et K" les contenus de M' et de M" respectivement : du raisonnement
précédent suit que K' est le nombre de classes mod. E, et
que chaque classe a le même nombre d'individus, qui est
K". Le recensement de la population donne donc K'*K" individus. Le
contenu K du message entier est donc K = K'*K", comme annoncé.
Exemple:
avec un premier sous-message formé de deux chiffre binaires
et le second sous-message étant de
la forme "la lettre A, B, ou C suivie de deux chiffres binaires",
Le premier sous-message peut être P = "00", "01", "10"
ou "11", donc 4 possibilités.
De même, nous avons 12 = 3 * 4 possibilités pour le second sous-message.
Et au total 4 * 12 = 48 possibilités pour le message entier.
On peut schématiser ainsi les
différents choix possibles en fonction des deux sous-messages :
\ A A A A B B B B C C C C
\ 0 0 1 1 0 0 1 1 0 0 1 1
\ 0 1 0 1 0 1 0 1 0 1 0 1
\
-------------------------------------
00 | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|
-------------------------------------
01 |13|14|15|..|..| | | | |..|23|24|
-------------------------------------
10 |25| | | | | | | | | | |36|
-------------------------------------
11 |37| | | | | | | | |..|47|48|
-------------------------------------
Soulignons que cette analyse
traite les deux sous-messages comme
"indépendants", et qu'elle vise en somme un "contenu maximal"
qui ne tient pas compte d'éventuelles restrictions
liées au contexte : par exemple, certains numéros
de téléphone ne sont pas valables, le département 00
n'existe pas, etc. Cet aspect de la question réapparaîtra plus
tard.
Plus généralement, un message composé de n sous-messages successifs, soit M = P1 P2 ... Pn a un contenu qui
est le produit des contenus des n sous-messages Pi. Si ces composants sont
tous de la même espèce (p.ex. des chiffres, ou des lettres),
et ont donc tous le même contenu (appelons-le C ), le contenu du message
M est C à la puissance n.
Exemple : Contenu d'une plaque d'immatriculation de format parisien (avec 3 lettres).
Le message se divise en trois sous-messages : M = P1 P2 P3 ,
où P1 est formé de 4 chiffres, P2
de 3 lettres et P3 de deux chiffres. Son contenu K
est donc le produit des trois contenus K1* K2* K3.
Le contenu de P1 est égal au contenu d'un chiffre à la puissance
4. Le contenu d'un chiffre est 10 (puisqu'il y a 10 chiffres 0, 1,
2,...,9). D'où K1 = 10 000.
Le contenu de P2 est égal à celui d'une
lettre au cube. Celui d'une lettre est 26, puisqu'il y
a 26 lettres à choisir dans l'alphabet, ce qui fait K2 = 263 = 17 576.
Enfin, par le même raisonnement que pour P1, K3 (le contenu de P3) vaut 100, donc au total K = 10 000 * 17 576 * 100 = 17 576 000 000.
Evidemment, nous avons simplifié le
problème en considérant qu'il y avait exactement
4 chiffres et 3 lettres, mais le principe demeure.
Notons
que si nous ne tenons pas compte des 2 derniers chiffres, en considérant
qu'ils ne font pas partie du message car nous
savons déjà que la voiture concernée est de Paris, le
contenu devient 175 760 000, ce qui montre que les Parisiens pourront continuer
quelque temps encore à immatriculer leurs
véhicules sans crainte d'épuiser les numéros disponibles
!
Notons aussi que le fait d'avoir un groupe de 3 lettres au
lieu de 2 joue un grand rôle : ajouter une lettre multiplie le contenu
par 26...
III - L'UNITÉ DE MESURE : LE BIT
A partir de tous ces exemples de
messages, il faut abstraire la grandeur "Information" et la munir d'une unité
de mesure.
a) Abstraction : Quoi de commun entre tous les messages ?
Il est clair que des messages de même contenu
peuvent se montrer sous des apparences très différentes,
liées aux codes employés pour les représenter.
Par exemple, une suite de chiffres interprétée
comme un nombre peut se représenter dans diverses
bases, voire s'écrire en chiffres romains.
Les plaques minéralogiques, outre leur fonction
d'identification des véhicules, doivent en plus
être facilement lisibles à distance, d'où
leur structure à trois champs bien distincts
et aisément mémorisables (bien plus que si on écrivait
seulement une suite de chiffres qui aurait le même contenu).
Il est donc naturel de se demander ce qui est commun à tous ces messages
qui ne sont que des représentations matérielles
différentes d'un même "message abstrait".
Le traitement automatique des messages (même le modeste télégraphe)
met en lumière le caractère invariant
du message à travers ses différentes représentations
(le texte écrit, le code Morse...).
Dirons-nous que c'est le contenu ? Pas tout-à-fait, parce
que le contenu, tel que nous l'avons défini, est un nombre,
et non un message. C'est un attribut du message, non une abstraction,
une essence du message.
Nous nous tournerons plutôt vers
une "forme standard" du message considéré, en convenant de le representer
avec des éléments les plus simples possibles : les bits.
b) Le message élémentaire binaire.
Comme tous les objets profondément naturels, le "bit" (contraction
de l'anglais binary digit ) peut s'interpréter de plusieurs façons.
En tant qu'objet, il est l'essence même de
l'objet : Être ou ne pas être, telle est la seule question à
laquelle il sache répondre.
En tant que message élémentaire,
il spécifie un choix entre deux possibilités.
Un message formé d'une suite de n bits indique donc une suite
de n choix binaires : son contenu est donc la n-ième puissance de
2.
Or, en procédant par dichotomies successives,
on arrive à reconstruire n'importe quel
processus de choix comme une suite de
choix binaires : l'ensemble des valeurs possibles
étant supposé divisé en deux parties, le
premier choix binaire détermine dans quelle
partie se trouve l'élu, puis le second choix dit dans quelle sous-partie
il se trouve, etc.
Il est clair que pour arriver le plus vite au résultat,
il faut à chaque fois partager l'ensemble des possibles
en deux parties égales, ou si le nombre d'éléments
est impair, presque égales. Les amateurs de
logarithmes verront immédiatement que le nombre minimum de choix
binaires pour arriver au résultat est le logarithme à base
2 du nombre total de possibles.
Exemple : choix du chiffre 3 parmi les 10 chiffres {0,...,9}.
- On divise la totalité {0,...,9} en deux parties {0,...,4}
et {5,...,9}, en notant "0" pour indiquer que le chiffre
choisi est dans {0,...,4} et "1" pour le cas contraire. Ici, c'est
"0".
- On divise {0,...,5} en {0,...,2} (indiqué
par "0") et {2,...,5} (désigné par "1"), donc "1" pour le choix
de 3.
- On divise {2,...,5} en {2, 3} ("0") et {4, 5} ("1"), donc "0".
- {2, 3} = {2} + {3}, a designer par "0" ou "1", ici "1", et la séquence de choix s'arrête ici.
- Le choix total s'exprime donc par le message "0101".
Ainsi, tout message pourra être traduit en un message formé
de bits : c'est ce message que nous regarderons comme la "forme standard",
et que nous appellerons l'information contenue dans le message.
Cette notion a évidemment le gros avantage de se
prêter très facilement à la réalisation
matérielle, donc à l'automatisation du traitement : les physiciens
ont mille et une manières de matérialiser
les bits, et l'industrie moderne sait construire des machines qui traitent directement l'information.
c) Interprétation numérique :
Les bits "abstraits" peuvent se réaliser
par des couples de symboles quelconques, comme l'absence
ou la présence d'une tension entre deux bornes, le sens de
passage des électrons, ou encore les chiffres 0
et 1 qu'on emploie couramment dans l'écriture.
Lorsque ces chiffres sont réinterprétés
comme représentant des entiers, un message
écrit en bits s'interprète comme la représentation
d'un nombre en base 2. [Si cette question de la représentation en base 2 reste obscure pour vous, voici une chance de l'éclaircir !]
Allez voir la chose en acte
: prenez un petit fichier (disons moins de 1024 octets, téléchargez par exemple la petite image flip.gif), et voyez
comment il se présente en tant que suite de bits, et quel entier (écrit
en décimal) on obtient si on interprète la suite de bits en question comme un
nombre écrit en binaire.
Faites la même opération avec le même image codée d'une autre manière (flip.jpg), et comparez les résultats.
Réciproquement, tout nombre entier (positif ou nul) peut se représenter
en base 2 et ainsi donner naissance à un message écrit
comme une suite de bits.
Mais, un même nombre peut s'écrire
d'une infinité de manières en binaire, car il peut
y avoir un nombre arbitraire de zéros
à gauche et ainsi donner naissance à une infinité de
messages.
Par exemple, le nombre 5 peut s'écrire 101, 0101, 00101,
000101, etc.
Ceci met en lumière la profonde différence
de nature entre les nombres et les messages, donc entre les nombres et les
informations.
Nous avons défini l'information portée par un message comme permettant
de choisir entre diverses éventualités connues à l'avance.
La donnée d'un nombre permet assurément de faire un choix :
il suffit de supposer que les éventualités en question sont numérotées, (ce qui est toujours loisible)
et de traiter notre nombre comme ordinal.
Ce qui manque, c'est la délimitation a priori du domaine où le
choix s'exerce : elle serait fournie par la donnée d'un second nombre,
supérieur au premier, qui donnerait la taille de l'échantillon.
Ceci correspond exactement à l'intuition courante :
Tu dis que tu es classé troisième, mais sur combien de candidats ?
Il est bien clair que le message "3ème / 3" dit moins de choses, apporte moins d'information que "3ème / 3000".
D'un point de vue pratique, un message ne se conçoit
que par rapport à un dispositif de transmission
(une carte, une fiche, une plaque minéralogique)
qui définit pratiquement son format, sa structure,
donc son contenu. Dans le cas de la représentation d'un nombre,
il faudra déclarer à l'avance le nombre de chiffres utilisés,
ce qui lève l'ambiguïté quant au nombre de zéros
initiaux. Du même coup, on a spécifié le nombre maximal qu'on poura
transmettre sous ce format, c'est-à-dire la taille de l'échantillon au
sein duquel le nombre transmis permet de choisir.
Dans ce cadre, on a donc une parfaite équivalence entre nombres entiers
et messages, qui est le fondement des procédés de cryptage modernes,
comme le célèbre système RSA [initiales des noms de ses trois
inventeurs Rivest, Shamir & Adleman (1977)], ou le populaire MD5.
Cette distinction entre le nombre (plus généralement,
l'objet du discours) et sa représentation matérielle
(le chaîne de chiffres, ou "nom
du nombre", que les Anglais appellent "numeral" et
pas "number") est familière aux informaticiens.
Les considérations
qui l'accompagnent (place occupée par cette représentation,
coût associé, choix et optimisations
qui en dépendent) entrent par la force de l'évolution
technologique dans les préoccupations de la quasi-totalité
de nos contemporains. Nous allons à présent donner quelques
détails à ce sujet.
Observons dès maintenant une conséquence de cette
attitude : pour transmettre une certaine information, il faut un certain
nombre de bits.
Par exemple, une lettre de l'alphabet,
dont le contenu est 26 comme nous l'avons vu, nécessite plus
de 4 bits puisque 2 puissance 4 = 16. Il faut donc au moins 5
bits pour traduire en binaire le contenu d'une lettre.
Or la cinquième puissance de 2 vaut 32, ce qui
veut dire que tout dispositif qui transmet des lettres peut aussi transmettre
quelques caractères supplémentaires.
On cherchera
donc à utiliser des messages dont le
contenu est une puissance de 2, de manière à utiliser
juste l'information nécessaire et pas plus. Nous
retrouvons ici le caractère exponentiel des contenus de messages...
IV - MOTS ET OCTETS
Il est peu efficace de manipuler des bits isolément. Dans la
pratique, ce sont toujours des agrégats de
bits qui interviennent, de préférence des agrégats
formés de n bits chacun, où n
est constant pour une machine donnée - le plus souvent une puissance
de 2, mais pas toujours. On les appelle des mots, et ils servent de
messages élémentaires à de nombreux points de
vue. Le contenu de chaque mot est alors la n-ième puissance de 2.
On parle ainsi de "machines à mots de n bits", n valant
4, 8, 12, 16, 32, 36, 40, 42, 48, 64, etc. Il est intéressant de se
faire une idée du contenu de chaque mot, vu comme un message élémentaire,
ce qui revient à passer en revue les puissances de 2. Pour éviter
de manipuler des nombres démesurément grands, nous introduirons trois unités de compte spécifiques, le kilobit, qui vaut 2^10 =
1024 bits, le mégabit, qui est le carré du kilo, soit 2^20 = 1 048 576 bits, et le gigabit qui 2^30 = 1 073 741 824 bits.
N Contenu
4 16 bits
8 256 bits
12 4096 = 4 kilobits
16 65 536 = 64 kilobits
32 4 294 967 296 = 4096 mégabits = 4 gigabits
64 17 179 869 184 gigabits (nombre énorme !)
arrêtons-nous là ...
Cette table permet d'apprécier la croissance fabuleuse de l'espace-mémoire disponible sur les ordinateurs.
Rappelons que chaque octet de la mémoire est repéré par une adresse
qui est un nombre entier, et ce nombre doit normalement être logeable
dans un mot-mémoire : la longueur du mot-mémoire conditionne la taille
de l'espace adressable, qui impose une borne supérieure à la mémoire
effectivement disponible.
On voit qu'avec ce principe un micro-ordinateur à mots de 8 bits (Z-80, Apple-II,
etc des années 80) ne pouvait utiliser que 256 octets de mémoire, ce
qui est fort peu. Aussi ces illustres ancêtres codaient-ils leurs
adresses sur deux mots : avec 16 bits d'adresse ils pouvaient disposer de 65 536 octets, ce qui permettait de travailler utilement.
Les processeurs à mots de 16 bits (ceux des premiers PC et des premiers
Macintosh) ont eu recours à des stratégies compliquées pour élargir la
zone des 64 kilo-octets, et il a fallu arriver aux
processeurs à mots de 32 bits (dans les années 90) pour que l'espace
des adresses ne soit plus un problème : avec 4 gigabits octets
adressables, c'est la taille effective de la mémoire qui imposait sa
limite, non plus la capacité logique de l'adressage. Aujourd'hui
seulement, dix ans après, on trouve couramment des ordinateurs portables avec des
mémoires vives de 1 gigabit, on atteindra bientôt sans doute la limite
des 4 gigabits. Mais entre-temps les machines à mots de 64 bits, qui
ont déjà fait leur apparition depuis quelques années, se seront
généralisées, et là vraiment la limite est hors de notre portée.
a) Influence de la longueur des mots. Bytes.
Comme souvent en Informatique, une contradiction
se dessine qui appelle un compromis : si les messages élémentaires
de la machine sont gros (mots longs), les opérations qu'elle effectue
seront plus simples puisque les messages seront plus courts, à information
égale (la complexité des opérations étant grosso
modo liée à la longueur des messages traités),
la machine sera donc rapide. Mais elle sera chère, car
l'organisation de mots longs demande un matériel coûteux, et
elle sera inefficace pour peu que la nature des traitements
à effectuer demande des messages nombreux, de peu d'information
chacun. Par exemple, des calculs sur des nombres réels
s'accommoderont bien de mots longs (qui permettront de loger un nombre par
mot), mais le traitement de données
non-numériques (textes, listes, etc.) n'y gagne rien, il aurait plutôt
besoin d'un grand nombre de mots courts.
Cette opposition a conduit autrefois à distinguer les "machines
à mots" et les "machines à caractères".
Aujourd'hui, elle apparaît dans la possibilité
fréquente de manipuler des octets, souvent appelés bytes dans la littérature de langue anglaise.
Un mot sur l'arithmétique en format fixe et le "bit de signe"
Pour une machine qui doit manipuler des entiers, l'idéal est de loger
chaque nombre dans un mot, où à la rigueur dans deux, pour
des raisons aisément compréhensibles de simplicité matérielle.
La longueur du mot impose alors une borne à la taille maximale des
entiers représentables directement en binaire, qui n'est autre que
K -1, où K est le contenu du mot ( moins un car on commence
à zéro).
Mais cela ne suffit pas, car on veut pouvoir faire des soustractions, et
représenter aussi les entiers négatifs ! La technique dite
du "complément à 2" interprète le bit de gauche dans
la représentation binaire comme un bit de signe, le signe étant
"+" si le bit est nul et "-" s'il vaut 1. Avec N = 4, par exemple,
"0101" = 5, mais
"1011" = -5 et non pas 11. Plus précisément, on prend comme
l'opposé d'un nombre n n'excédant pas K-1 l'unique nombre
n' tel que n+n' = 2 ^ N, c'est à dire que n+n' s'écrit
en binaire comme 1 suivi de N zéros.
Ainsi, la moitié des messages est interprétée comme
des nombres négatifs, et du coup, les entiers supérieurs à
(K/2)-1 ne peuvent plus être représentés. Nos mots-messages
ont bien un contenu de K, permettant de repérer un entier dans une
population de taille K, seulement cette population est l'intervalle [-K/2
, +(K/2)-1 ] et non pas [0 , K-1 ] comme on aurait pu le croire.
b) Longueurs puissances de 2. Octets.
Pour des raisons techniques assez naturelles, on tend à
choisir des longueurs de mots qui sont des puissances de
2 : 4, 8, 16, 32. Les autres longeurs (12, 36...) sont moins souvent
utilisées aujourd'hui.
Les premiers micro-processeurs utilisaient des mots
de 4 bits, donc avec un contenu de 16, ce qui ne convenait qu'à
certains automatismes spécialisés. On est ensuite passé
à la longueur 8 (contenu 256), ce qui a permis l'extraordinaire essor
de la micro-informatique (en représentant les entiers en "complément
à 2" sur 16 bits - 2 mots - on va de -32 768 à +32 767, ce
qui suffit pour des calculs ordinaires, et avec des adresses sur 16 bits
-idem- on travaille avec une mémoire maximale de 64 kilo octets, ce
qui a été pendant longtemps largement suffisant) : les célèbres
Apple II et TRS-80, par exemple, sont des machines à mots de 8 bits.
Il en allait de même pour les Micral-80, Sil'z II, Logabax
LX, Thomson T07 et M05 qui furent distribués dans les écoles françaises dans les années 80.
Le pas suivant fut celui les micro-processeurs à
16 bits, comme ceux qui équipaient les IBM-PC, Micral-30,
Sil'z 15 et Logabax Persona, ainsi que le fameux MacIntosh. Le saut
qualitatif fut considérable, mais il fut bientôt suivi de la
généralisation des processeurs à 32 bits - en douceur dans le monde
Mac, avec plus de fracas dans l'univers du PC. Et nous arrivons
maintanant
à 64 bits !
Dans tout ce développement, la structure
à 8 bits, ou octet, garde une remarquable
stabilité. Un mot de 16 bits est très naturellement
divisé en 2 bytes de 8 bits, etc. Tant
et si bien que très souvent on considère "byte" comme
synonyme d'octet. Et l'octet est l'unité
couramment employée pour mesurer les capacités de mémoires
: quand on dit "64 K", ce sont (sauf mention contraire) 64 kilo-octets. Nous
verrons plus loin une des raisons de cette stabilité, qui est le choix
de l'octet pour coder les caractère
c) Notations : binaire, octal, hexadécimal.
De même que la machine ne manipule pas les
bits isolément, l'être humain ne peut pas penser
de longues chaînes de bits. Il lui faut une notation
plus synthétique pour traiter l'information en tant que telle.
Cette notation doit respecter autant que possible la structure des
messages, ne cachant que ce que l'on veut négliger.
Plus précisément, une bonne notation
doit permettre de retrouver l'écriture binaire simplement en substituant
à chaque symbole sa valeur en binaire : si le symbole "x"
représente "101", et "y" "001", on souhaite que la séquence
"xyx" représente "101""001""101", donc "101001101".
Si on cherche cette notation sous la forme de l'écriture
dans une base idoine du nombre représenté
par le message en binaire, celà signifie que la
base choisie doit être une puissance de 2. (Pour
la démonstration de ce théorème, adressez-vous
à votre mathématicien préféré).
Par exemple, la base 10 n'est pas adaptée, car l'écriture
décimale bouleverse la structure du mot, puisque "5" représente
"101", "1" vaut "001", mais la traduction en binaire de "515"
est "1000000011" et non "101001101".
On a donc le choix, pratiquement, entre
la base 8 (octal) et la base 16 (hexadécimal). Dans
notre exemple précédent, 515 écrit en octal donne effectivement
"101001101". Si on le prend en hexadécimal, chaque chiffre
doit s'écrire en binaire sur 4 bits, d'où 5 = "0101" et 1 =
"0001", ce qui donne 515 = "010100010101".
La base 8 convient si les sous-mots significatifs sont
de longueur 3, ce qui fut le cas il y a quelques années
(mots de 12, 24 et 36 bits). Ce n'est plus le cas aujourd'hui
où l'octet règne en maître, et
tous les praticiens se servent de la base 16.
Chacun des 16 chiffres hexa (0, 1, 2, 3, ..., 9, A, B, C, D,
E, F) représente exactement 4 bits, et un
octet s'écrit donc comme 2 chiffres, ce qui est suffisant
tant qu'on n'a pas souvent affaire à
des mots de 64 bits ! Voici la table de correspondance.
Par exemple, les 64 x 1024 = 65536 messages
binaires de longueur 16 (deux octets), s'énumèrent harmonieusement
en hexadécimal de "0000" a "FFFF", ce qui rend beaucoup
plus intelligible la "géographie"
de la mémoire d'un micro-ordinateur à
mots de 8 bits. Nous verrons d'autres exemples dans
le paragraphe suivant.
V - CODAGE DES CARACTERES. LE CODE ASCII.
La plupart des messages de la vie courante sont écrits
(ou peuvent s'écrire) avec un jeu de symboles
(messages élémentaires) empruntés à l'imprimerie.
Grâce à la machine à écrire,
Gutenberg est constamment présent parmi nous. D'où l'urgente
nécessité de convenir d'une traduction standard des caractères
d'imprimerie en binaire.
a) Taille de l'alphabet et nombre de bits.
De combien de caractères avons-nous
besoin ? 26 lettres, 10 chiffres, différents
signes de ponctuation, des symboles comme "+", "/", "=",
etc. En outre, différents "caractères
non imprimables" jouent un grand rôle dans
l'économie des transmissions électroniques (saut
de ligne, saut de page, mais aussi accusé de réception, fin
de texte et autres symboles ésotériques, appelés en
jargon technique "caractères de contrôle").
Il n'est pas inutile de passer brièvement en revue quelques-unes
des solutions qui ont été adoptées :
- avec 5 bits par caractère,
donc 32 symboles différents, on ne peut transmettre un
alphabet convenable qu'au moyen d'une convention qui donne
à deux de ces caractères le pouvoir d'indiquer
"les caractères suivants sont des lettres"
ou "les suivants sont des chiffres". On réussit ainsi
à transmettre 60 caractères significatifs différents
: c'est le "code Baudot", ou "code télégraphique", utilisé
pour le Telex.
- avec 6 bits, 64 symboles,
on a les majuscules, les chiffres et quelques signes de ponctuation.
Le code "DCB" (= Décimal Codé Binaire) est de ce
type. Il a été très
employé aux premiers temps de l'informatique.
C'est de lui que vient la tradition de tout écrire en majuscules.
Peut-être quelques vieilles imprimantes l'utilisent-elles encore
? Mais plus probablement l'idée
que "les machines ne connaissent que les majuscules"
reste ancrée dans les esprits humains en dépit des progrès
techniques.
- avec 7 bits, 128 symboles, on
a majuscules, minuscules, chiffres, signes de ponctuation et caractères
de contrôle (non imprimables). Le code le plus répandu
est appelé couramment "code ASCII" (pour American Standard Code
for Information Interchange). Nous allons en
reparler longuement.
- avec 8 bits, 256 symboles, on est
vraiment à l'aise, tellement que certaines configurations ne sont
pas significatives. Il existe un code de ce type qui a été assez
utilisé, appelé "code EBCDIC" (Extended Binary Coded Decimal
Interchange Code). Nous n'en dirons rien de plus.
Notons que le code ASCII n'emploie que
7 bits significatifs, mais qu'il s'adjoint en général
un 8ème bit appelé "bit de parité" : ce bit vaut "0"
ou "1" selon que le nombre de bits non nuls
du message est pair ou impair, de telle sorte que le
nombre total de bits non nuls (c'est-à-dire valant 1) soit toujours
pair. Cette convention permet de détecter d'éventuelles
erreurs de transmission : si un bit manque à l'appel, la condition
de parité est violée et le caractère est réputé
erroné. S'il en manque deux, l'erreur
n'est plus détectée, mais on peut espérer que
le cas est plus rare !
Avec le bit de parité, le code ASCII établit la correspondance
: un caractère = un octet que nous avions annoncée au début
de ce texte.
b) Structure du code ASCII :
Ce code est le plus couramment employé
actuellement en informatique. Il sert de base à de nombreux
codes plus étendus, mettant à profit un 8ème bit significatif
(et non plus un 8ème bit de parité), donc avec 256 caractères,
p.ex. le code de l'IBM PC. Nous allons donc l'examiner
en détail. En particulier, nous verrons comment la représentation
par octets fait apparaître des régularités qui traduisent
"naturellement" la structure du clavier d'un micro-ordinateur (passage de
la minuscule à la majuscule par "shift", caractères de contrôle
commandés par la touche ad hoc).
La programmation en langage C fait grand usage de l'identification du type des caractrèes char à un sous-type dut type des entiers int :
tout caractère est automatiquement un entier...
Pour mieux apprécier les remarques
suivantes, on se reportera à la table ci-jointe.
Le but des observations qui suivent est de montrer comment certaines opérations
sur le jeu de caractères qui s'effectuent traditionnellement au clavier
correspondent à propriétés structurelles du code ASCII.
Nous examinerons successivement le passage majuscules/minuscules (rôle
de la touche "shift") et la notion de caractères de contrôle
(touche "control").
Notation :
Nous considérons que les 8 bits d'un octet sont numérotés,
conformément à la tradition, de droite à gauche et de
0 à 7 : b7 b6 b5 b4 b3 b2 b1 b0. Si le contenu du mot est interprété
comme un nombre entier n écrit en base 2, le numéro de chaque
bit est ainsi exactement la puissance de 2 à laquelle
ce bit est affecté :
n = b7 27 + b6 26 + ... + b2 22 + b1 21 + b0 20.
Rappelons la correspondance entre mots de 4 bits et chiffres hexadécimaux :
0 = 0 0 0 0
4 = 0 1 0 0 8 = 1 0 0 0
C = 1 1 0 0
1 = 0 0 0 1
5 = 0 1 0 1 9 = 1 0 0 1
D = 1 1 0 1
2 = 0 0 1 0
6 = 0 1 1 0 A = 1 0 1 0
E = 1 1 1 0
3 = 0 0 1 1
7 = 0 1 1 1 B = 1 0 1 1
F = 1 1 1 1
On observe que le code le plus grand
(interprété comme un nombre) est 127 (décimal)
= 7F (hexa), donc que tous les octets ont leur bit 7 qui
est nul (en d'autres termes, tous ces octets ont 0 dans leur case la plus
à gauche, le plus grand étant 7F = 01111111). Ceci correspond
à l'usage de ce bit comme bit de parité, dont nous ne
tenons pas compte ici : de notre point de vue, il n'est pas significatif.
MAJUSCULES et minuscules :
Remarque : Le code des lettres majuscules a pour premier chiffre hexa
4 ou 5, l'octet correspondant est donc de la forme "0100 XXXX" ou "0101
XXXX", par conséquent dans les deux cas le bit
5 de l'octet est nul. Ainsi par exemple,
"M" = 4D = "0100 1101" ou "W" = 57 = "0101 0111".
Règle : Le code d'une lettre minuscule est obtenu en donnant la valeur
1 au bit 5 du code de la majuscule correspondante. On échange donc
majuscule et minuscule en faisant varier uniquement la valeur du bit 5.
Exemples : "m" = 6D = 0110 1101, ou "w" = 77 = 0111 0111.
Du point de vue de la numération hexadécimale,
ce bit 5 mis à 1 correspond à augmenter de 2
le premier chiffre hexa. En décimal,
il correspond à une translation de 2 puissance 5 = 32 : le rang
d'une minuscule dans l'énumeration du code ASCII est égal à
celui de la majuscule augmenté de 32.
Caractères de contrôle :
Ce sont les caractères "non imprimables" qui occupent les 32
premières places, ils sont donnés dans la table avec leurs
noms cabalistiques traditionnels. Leurs numéros ont un premier
chiffre hexa 0 ou 1, ce qui correspond dans l'octet à un bit 6 qui
est nul.
Pour désigner couramment ces caractères, on les associe
avec ceux des rangs 64 à 95 (les majuscules et quelques autres symboles),
dont le premier chiffre hexa est 4 ou 5,
en annulant le bit 6. Cette correspondance
est exprimée traditionnellement par le mot "control", notée
"^" et opérée au clavier en appuyant sur la touche
"CTRL". Elle correspond à une translation de numéros de 2 puissance
6 = 64, qui se traduit en hexadécimal par une diminution de 4 du premier chiffre.
Exemples :
-
de "H" = 48 hexa = 0100 1000, n° 72,
vient "^H" (pronconcer "contrôle H") = 0000 1000 = 08 hexa, n°
8,
c'est le caractère BS alias Backspace
- de "J" = 4A hexa = 0100 1010, n° 74, vient "^J" ("contrôle J") = 0A hexa = 0000 1010, n° 10,
c'est le caractère LF alias "Nouvelle ligne" (ou Line Feed).
Autres exemples :
-
"G" = 47 -> "^G" = 07 BEL ( "Sonnerie")
- "L" = 4C -> "^L" = 0C FF ("Saut de page" ou Form Feed)
- "M" = 4D -> "^M" = 0D CR ("Retour chariot" ou Carriage Return)
à ne pas confondre avec LF !
etc.
A noter que le caractère ESCape (n° 27) sort de la zone des "control-lettres",
aussi a-t-il en général une touche spéciale au clavier.
Exemple d'application : on lit dans le Manuel Unix relatif à la commande "cat" (% man cat), l'explication suivante à l'option "-v" :
-v Displays non-printing characters so they are visible. Control
characters print as `^X' for control-X; the delete character
(octal 0177) prints as `^?' Non-ascii characters (with the high
bit set) are printed as `M-' (for meta) followed by the character
for the low 7 bits.
Comme on le voit, le code ASCII a une structure très étudiée.
Il est beaucoup plus commode à utiliser que
le code EBCDIC par exemple, d'où son succès. Malheureusement,
il ne fait aucune place aux lettres accentuées, aux cédilles
et autres signes diacritiques absents de l'écriture
américaine, au grand dam des langues qui font
appel à une typographie plus raffinée. La solution la
plus souvent retenue est d'attribuer les codes de
certains caractères moins utilisés aux lettres
en question : par exemple "{" pour "é" , "}" pour "è" et "@"
pour "à". Mais du coup on se prive des
caractères en question. Choix cornélien ... Suite de ce débat au cours n°3.
Ce problème ne sera vraiment résolu
que par une technologie plus puissante (écrans
graphiques), voir les cours suivants.