IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

C - Afficher valeur d'entier sous forme "machine"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 30
    Par défaut C - Afficher valeur d'entier sous forme "machine"
    Hello,

    Je viens pour vous demander un peu d'aide !

    En fait, je voudrait mettre en difference la gestion memoire sous les architechture little/big endian ! Pour cela, je voudrais afficher la valeur en binaire d'un nombre octet par octet ! Oui, c'est un peu confus ...

    En gros cree un unsigned int et je recupere son adresse dans un char * pour afficher octets par octet... le probleme c'est que ... ... ca ne fonctionne pas !!! Et je ne comprend pas pourquoi ! Un peu d'aide serait la bienvenue !

    Voil mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include        <unistd.h>
     
    int             my_putchar(int c)
    {
      return (write(1, &c, 1));
    }
     
    void            test_conv(const unsigned int nbr)
    {
      char          *nbr_addr;
      unsigned int  mask;
     
      nbr_addr = (char *) &nbr;
      mask = 0x800000;
      while (mask)
        {
          my_putchar('0' + ((nbr & mask) != 0));
          mask >>= 1;
          if (mask == 0x80000 || mask == 0x8000 || mask == 0x800 || mask == 0x80 || mask == 0x8)
            my_putchar('\'');
        }
      my_putchar('\n');
    }
     
    void            aff_octet(const char nbr)
    {
      int           mask;
     
      mask = 0x8;
      while (mask)
        {
          my_putchar('0' + ((nbr & mask) != 0));
          mask >>= 1;
        }
    }
     
    void            aff_val(const unsigned int nbr)
    {
      char          *nbr_addr;
      unsigned int  mask;
     
      nbr_addr = (char *) &nbr;
      mask = 0xF00000;
      while (mask)
        {
          aff_octet(*nbr_addr++);
          mask >>=4;
          if (mask)
            my_putchar('\'');
        }
      my_putchar('\n');
    }
     
    int             main()
    {
      test_conv(0xFABC80);
      aff_val(0xFABC80);
      return (0);
    }
    resultat sous une archi little endian :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp $>cc endian.c -Wall -Wextra && ./a.out
    1111'1010'1011'1100'1000'0000
    0000'1100'1010'0000'0000'0011
    et big endian
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > /usr/sfw/bin/gcc endian.c -o test
    > ./test
    1111'1010'1011'1100'1000'0000
    0000'1010'1100'0000'0000'0000
    D'avance, merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    aff_octet()
    Pourquoi appelles-tu ta fonction aff_octet() alors qu'elle n'affiche pas un octet mais 4 bits ? Pour tromper l'ennemi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void aff_octet(const char nbr)
    {
      int mask;
      mask = 0x80 ; //<<<<< 0x8;
      while (mask)
        {
          my_putchar('0' + ((nbr & mask) != 0));
          mask >>= 1;
          if(mask == 0x8) my_putchar('\'');//<<<<<
        }
    }
    aff_val()
    - je suppose que tes entiers ne font pas 24 bits, mais 32. L'initialisation de mask est alors fausse.
    - Lorsqu'on passe d'un octet à l'autre, le masque doit être décalé de 8, pas de 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void aff_val(const unsigned int nbr)
    {
      char *nbr_addr;
      unsigned int mask;
      nbr_addr = (char *) &nbr;
      mask = 0xFF000000; //<<<<<< 0xF00000;
      while (mask)
        {
          aff_octet(*nbr_addr++);
          mask >>= 8;   //<<<<<<4;
          if (mask) my_putchar('\'');
        }
      my_putchar('\n');
    }
    test_conv()
    Si tes entiers font 32 bits, il faut corriger le masque et compléter le gros if()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void test_conv(const unsigned int nbr)
    {
      char *nbr_addr;
      unsigned int  mask;
      nbr_addr = (char *) &nbr;
      mask = 0x80000000;  //<<<<<< 0x800000;
      while (mask)
        {
          my_putchar('0' + ((nbr & mask) != 0));
          mask >>= 1;
          if (   mask == 0x8000000 || mask == 0x800000 // <<<<<<
              || mask == 0x80000   || mask == 0x8000 || mask == 0x800 || mask == 0x80 || mask == 0x8) 
            my_putchar('\'');
        }
      my_putchar('\n');
    }

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Je n'ai pas regardé ton code dans le détail.
    J'en ai écrit un autre qui affiche le nombre sous ça forme hexadécimale (suffisant pour démontrer l'organisation des octets) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        unsigned int nbr = 0xFA5C784E;
        size_t bcl = sizeof nbr;
        unsigned char* nbr_addr = (unsigned char*)&nbr;
     
        while (bcl--)
        {
            printf("%02X ", *nbr_addr++);
        }
    En sortie, j'obtiens ça :
    Précision : je suis sur un Pentium, donc sur une architecture little-endian.

Discussions similaires

  1. [Débutant]Récuperer les valeurs de panel sous forme de matrice
    Par feather1 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/02/2008, 18h09
  2. Affiché le fichier séléctionner sous forme de texte
    Par Jeremy0201 dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/07/2007, 15h45
  3. Afficher un programme C sous forme d'un graphe
    Par progfou dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 28/02/2006, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo