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 :

Cast et champ de bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut Cast et champ de bits
    Bonjour,

    Admettons que j'ai un tableau de 4 unsigned chars définit de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char toto[4] = {0xFE, 0xDC, 0xBA, 0x98};
    J'aimerai maintenant avec les 27 premiers bits à partir de l'adresse de toto affecter une variable int. Pour cela je définit un champ de bits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct
    {
        unsigned int entier: 27;
     } Entier27;
    Essayons ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Entier27 e27;
     
    e27.entier = *toto;
     
    printf ("%d\n", e27.entier);
    Citation Envoyé par Resultat
    134217726
    Ça sent le gaz, mais vérifions le résultat:
    0xFEDCBA98 = 0b1111 1110 1101 1100 1011 1010 1001 1000
    0d134217726 = 0b111 1111 1111 1111 1111 1111 1110

    Comme je m'y attendais je ne tombe pas sur le bon résultat. Bien sûr je pourrais arriver à faire ce que je veux en utilisant des décalages et des masques mais c'est trop compliqué pour pas grand chose.

    Quelqu'un a une idée ?

    Merci

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    essaye (a un comportement différent suivant l'endianess de ta machine)

    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
    #include <stdio.h>
     
    typedef union {
      unsigned char bytes[4];
      unsigned int integer;
      unsigned int integer27:27;
    } test_t;
     
    int main()
    {
      test_t test;
      test.bytes[0]=0xFF;
      test.bytes[1]=0x00;
      test.bytes[2]=0xF0;
      test.bytes[3]=0x0F;
     
      printf("integer27 = 0x%08X\n", test.integer27);
      printf("integer   = 0x%08X\n", test.integer);
      printf("bytes     = 0x%02X 0x%02X 0x%02X 0x%02X\n", test.bytes[3], test.bytes[2], test.bytes[1], test.bytes[0]);
     
     
      return 0;
    }

  3. #3
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Merci beaucoup

    Citation Envoyé par kwariz Voir le message
    Salut,

    essaye (à un comportement différent suivant l'endianess de ta machine)

    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
    #include <stdio.h>
     
    typedef union {
      unsigned char bytes[4];
      unsigned int integer;
      unsigned int integer27:27;
    } test_t;
     
    int main()
    {
      test_t test;
      test.bytes[0]=0xFF;
      test.bytes[1]=0x00;
      test.bytes[2]=0xF0;
      test.bytes[3]=0x0F;
     
      printf("integer27 = 0x%08X\n", test.integer27);
      printf("integer   = 0x%08X\n", test.integer);
      printf("bytes     = 0x%02X 0x%02X 0x%02X 0x%02X\n", test.bytes[3], test.bytes[2], test.bytes[1], test.bytes[0]);
     
     
      return 0;
    }
    Ça m'a l'air d'être bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    integer27 = 0x07F000FF
    integer   = 0x0FF000FF
    bytes     = 0x0F 0xF0 0x00 0xFF
    0x07F000FF=00000111 11110000 00000000 11111111
    0x0FF000FF=00001111 11110000 00000000 11111111


    Sinon, par la même occasion, j'ai pu aussi corriger le problème de 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
    typedef struct
    {
        unsigned int entier: 27;
    } Entier27;
     
     
    int main(void)
    {
        unsigned char toto[4] = {0xFF, 0x00, 0xF0, 0x0F};
        Entier27 e27;
     
        e27.entier = *(unsigned int*)toto;
     
        printf ("%x\n", e27.entier);
     
        return 0;
    }

  4. #4
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Sinon, tu entends quoi exactement par un comportement différent suivant l'endianess de ma machine ? (je sais que ça a un rapport ave little et big endian mais je saisi pas bien... )

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Il y a juste l'ordre pour le tableau bytes à respecter qui dépend de l'endianess (je l'affiche "à l'envers" car mon environnement est little-endian).

  6. #6
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Oups, j'avais dit un tableau de unsigned chars, je corrige:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char toto[4] = {0xFE, 0xDC, 0xBA, 0x98};
    et du coup, on trouve 254 :s

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Champs de bits de taille dynamique
    Par Chop_chop dans le forum C++
    Réponses: 5
    Dernier message: 13/07/2007, 15h16
  2. champs de bits
    Par Nico_stras dans le forum C++/CLI
    Réponses: 6
    Dernier message: 31/01/2007, 12h37
  3. enum et champs de bits
    Par FamiDoo dans le forum C++
    Réponses: 12
    Dernier message: 12/07/2006, 13h22
  4. Champs de bit et affectation
    Par the_ionic dans le forum C
    Réponses: 11
    Dernier message: 09/06/2006, 16h13
  5. lire un champ de bit a partir d'un fichier
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 09/08/2005, 12h53

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