Un programme visualisant la structure des octets
en fonction du type de la variable

(dû à Marie-Anne Moreaux)

  1. Qu'est ce que ça fait ?
  2. Comment c'est fait ?
  3. Codage des caractères
  1. Qu'est ce que ça fait ?

    Ce programme vous propose de lire une information (nombre ou caractère) selon un format (type) que vous aurez choisi auparavant,
    moyennant quoi il vous montre les octets qui représentent cette information selon différents formats (types),
    à savoir les types short, unsigned short, int, unsigned int, char et unsigned char.

    Voici un exemple d'exécution :


    jfp% ./a.out
    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    4

    Taper un (grand) nombre, positif ou négatif : -1
    ===========================================================================================
    J'ai lu : 4294967295
    1111 1111 1111 1111 1111 1111 1111 1111

    Cette information interprétée comme un short: -1
    1111 1111 1111 1111

    Cette information interprétée comme un unsigned short: 65535
    1111 1111 1111 1111

    Cette information interprétée comme un int: -1
    1111 1111 1111 1111 1111 1111 1111 1111

    Cette information interprétée comme un char: ?
    1111 1111

    Cette information interprétée comme un unsigned char: ?
    1111 1111

    ===========================================================================================

    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    1

    Taper un (petit) nombre, positif ou négatif : 65535
    ===========================================================================================
    J'ai lu : -1
    1111 1111 1111 1111

    Cette information interprétée comme un unsigned short: 65535
    1111 1111 1111 1111

    Cette information interprétée comme un int : -1
    1111 1111 1111 1111 1111 1111 1111 1111

    Cette information interprétée comme un unsigned int: 4294967295
    1111 1111 1111 1111 1111 1111 1111 1111

    Cette information interprétée comme un char: ?
    1111 1111

    Cette information interprétée comme un unsigned char: ?
    1111 1111

    ===========================================================================================

    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    5

    Taper un caractère (pas un nombre !) : x
    ===========================================================================================
    J'ai lu : x
    0111 1000

    Cette information interprétée comme un short: 120
    0000 0000 0111 1000

    Cette information interprétée comme un unsigned short: 120
    0000 0000 0111 1000

    Cette information interprétée comme un int: 120
    0000 0000 0000 0000 0000 0000 0111 1000

    Cette information interprétée comme un unsigned int: 120
    0000 0000 0000 0000 0000 0000 0111 1000

    Cette information interprétée comme un unsigned char: x
    0111 1000

    ===========================================================================================

    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    5

    Taper un caractère (pas un nombre !) : é
    ===========================================================================================
    J'ai lu : ?
    1100 0011

    Cette information interprétée comme un short: -61
    1111 1111 1100 0011

    Cette information interprétée comme un unsigned short: 65475
    1111 1111 1100 0011

    Cette information interprétée comme un int: -61
    1111 1111 1111 1111 1111 1111 1100 0011

    Cette information interprétée comme un unsigned int: 4294967235
    1111 1111 1111 1111 1111 1111 1100 0011

    Cette information interprétée comme un unsigned char: ?
    1100 0011

    ===========================================================================================

    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    0

    Au-revoir !


    On y voit le complément à 2 en œuvre, ainsi que la propagation du bit de signe :
    lorsqu'on convertit un nombre en un format plus grand, par exemple de short à int,

  2. Comment c'est fait ?

    Ce programme est écrit en C++, il se compose de deux fichiers ChBinaireU.cpp et binaireU.h.
    Le premier contient le programme principal, le second la déclaration d'une fonction générique C++
    pour l'affichage d'une chaîne de bits conformément à un type.
    [Cette fonction prend deux arguments : le type et le nombre ;
      pour le type ce n'est pas réalisable en C, d'où le recours à C++.]

    Si les deux fichiers sont dans le même répertoire, la commande de compilation g++ -Wall -pedantic ChBinaireU.cpp
    suffit. (Attention ! employer "g++" et non "gcc").

    Notez que ces deux fichiers-texte sont codés en UTF-8 !
    En effet, ils comportent quelques lettres accentuées dans les commentaires et surtout dans les messages imprimés à l'écran.
    Assurez-vous que votre compilateur accepte ce codage, et dans le cas contraire recodez les fichiers.
    Voir ci-après plus de détails sur ce point.

  3. Codage des caractères

    Le codage des caractères influe sur l'exécution du programme en deux points :
    1. l'impression des messages (p.ex. "...donnée...", "...interprétée...") ;
    2. la lecture des caractères avec les options 5 et 6

    On retrouve ici la problématique de la 3ème question de l'examen de janvier 2007.
    Il faut distinguer Si ces codages sont différents, les lettres accentuées des messages seront mal imprimées à l'exécution.

    La représentation des caractères donnés par l'utilisateur lors de l'exécution dépend uniquement du système d'exploitation.

    L'exemple d'exécution ci-dessus correspond à des fichiers-source codés en UTF-8,
    avec un système d'exploitation qui utilise UTF-8.
    Essayez avec d'autres configurations !

    Voici ce que donne le caractère "é" sous Windows, le texte-source du programme ayant été converti au codage Windows-1252
    et avec la page de code (codepage) cp 1252 activée à l'exécution :


    Quel type de donnée voulez-vous entrer ? 
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    5

    Taper un caractère (pas un nombre !) : é
    ===========================================================================================
    J'ai lu : é
    1110 1001

    Cette information interprétée comme un short: -23
    1111 1111 1110 1001

    Cette information interprétée comme un unsigned short: 65513
    1111 1111 1110 1001

    Cette information interprétée comme un int: -23
    1111 1111 1111 1111 1111 1111 1110 1001

    Cette information interprétée comme un unsigned int: 4294967273
    1111 1111 1111 1111 1111 1111 1110 1001

    Cette information interprétée comme un unsigned char: é
    1110 1001

    ===========================================================================================

    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    6

    Taper un caractère (pas un nombre !) : é
    ===========================================================================================
    J'ai lu : é
    1110 1001

    Cette information interprétée comme un short: 233
    0000 0000 1110 1001

    Cette information interprétée comme un unsigned short: 233
    0000 0000 1110 1001

    Cette information interprétée comme un int: 233
    0000 0000 0000 0000 0000 0000 1110 1001

    Cette information interprétée comme un unsigned int: 233
    0000 0000 0000 0000 0000 0000 1110 1001

    Cette information interprétée comme un unsigned char: é
    1110 1001

    ===========================================================================================

    Quel type de donnée voulez-vous entrer ?
    0: arret, 1: short, 2: unsigned short, 3: int, 4: unsigned int, 5: char, 6: unsigned char)
    ------------------------------------------------------------------------------------------
    0
    Au-revoir !