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


  1. Introduction  : Utilité de comprendre ces notions.

  2. Messages, structure et contenu
    1. Nature des messages, exemples
    2. Signification, contenu d'un message
    3. La loi fondamentale

  3. L'unité de mesure : le bit
    1. Abstraction 
    2. Le message élémentaire binaire
    3. Interprétation numérique

  4. Mots et Octets
    1. Influence de la longueur des mots. Bytes
    2. Longueurs puissances de 2. Octets
    3. Notations : binaire, octal, hexadécimal

  5. Codage des caractères. Le code ASCII
    1. Taille de l'alphabet et nombre de bits
    2. Structure du code ASCII
    3. Note sur la représentation du saut de ligne


  1. 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).

  2. 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 P1K3  (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...

  3. 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}.

    1.  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".
    2. On divise {0,...,5} en {0,...,2} (indiqué par "0") et {2,...,5} (désigné par "1"), donc "1" pour le choix de 3.
    3. On divise {2,...,5} en {2, 3} ("0") et {4, 5} ("1"), donc "0".
    4. {2, 3} = {2} + {3}, a designer par "0" ou "1", ici "1", et la séquence de choix s'arrête ici.

    5. 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...

  4. 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.


  5. 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 caractères 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.

    Table du code ASCII

    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 :

    Autres exemples :
      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.