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 :

Éclaircissement sur les structures de bit


Sujet :

C++

  1. #1
    Membre confirmé Avatar de buse974
    Homme Profil pro
    Développeur / Chef de projet informatique
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur / Chef de projet informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Par défaut Éclaircissement sur les structures de bit
    Bonjour,

    j'ai besoin de quelque éclaircissement sur les structure de bit.

    donc j'ai pas mal lu de doc dessus, donc d'après ce que j'ai compris elle ce définie de la sorte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct test{
    unsigned int bit1: 1;
    unsigned int bit2: 1;
    unsigned int bit3: 1;
    unsigned int bit4: 1;
    unsigned int bit5: 1;
    unsigned int bit6: 1;
    unsigned int bit7: 1;
    unsigned int bit8: 1;
    };
    donc apparemment on déclare le bit avec unsigned int , donc ce qui me cause problème c'est que quand je fait un sizeof(test) de ma structure j'ai 4 octet (normal c'est un entier) donc vu que je travaille sur des octets j'ai testé de cette maniéré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct test{
    unsigned char bit1: 1;
    unsigned char bit2: 1;
    unsigned char bit3: 1;
    unsigned char bit4: 1;
    unsigned char bit5: 1;
    unsigned char bit6: 1;
    unsigned char bit7: 1;
    unsigned char bit8: 1;
    };
    donc avec un "unsigned char" la cela compile très bien et sizeof me retourne bien 1 octet.

    donc ce que je me demande ces pourquoi tout fonctionne bien alors que les doc que je lis dise que ça fonction qu'avec des entier non signé, c'est surtout pour savoir si ce que je fait et propre car dans mon cas cela m'arrange car je travaille sur des octets, aussi cela me permettra de validé mon choix.

    merci d'avance.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Il faut entendre "entier non signé" au sens large (type entier non signé) et non pas juste "unsigned int". Tu peux donc utiliser tous ces types sans soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned char
    unsigned short
    unsigned int
    unsigned long
    unsigned long long

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    La norme 9.6 :
    A bit-field shall have integral or enumeration type (3.9.1).
    La norme 3.9.1 :
    Types bool, char, wchar_t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type.
    Donc tu dois pouvoir faire des champs de bits sur des [signed/unsigned] char, short, int, long, sur wchar_t, sur bool et sur des enum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       enum E
       {
          E_1,
          E_2
       };
       struct champs_de_bits
       {
          char b1:1;
          unsigned char b2:2;
          bool b3:1;
          E b4:1;
          long b5:30;
          wchar_t b6:7;
       };

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par 3DArchi
    Donc tu dois pouvoir faire des champs de bits sur des [signed/unsigned] char, short, int, long, sur wchar_t, sur bool et sur des enum
    Exact. En C par contre (parce qu'avec le code présenté on ne peut être sûr si c'est du C ou du C++), seul le support des types int et unsigned int sont requis, le reste dépend de l'implémentation.

    Citation Envoyé par buse974
    donc ce que je me demande ces pourquoi tout fonctionne bien alors que les doc que je lis dise que ça fonction qu'avec des entier non signé
    Sylvain Togni t'a déjà donné la réponse, mais cette doc est en outre erronée parce que tu peux aussi utiliser les types signés.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Melem Voir le message
    Exact. En C par contre (parce qu'avec le code présenté on ne peut être sûr si c'est du C ou du C++), seul le support des types int et unsigned int sont requis, le reste dépend de l'implémentation.
    Effectivement, ma réponse était C++iène vu le forum
    La norme C dit seulement :
    A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed int, unsigned int, or some other implementation-defined type.
    Donc, comme tu dis, avec unsigned int, on est garanti que ça compile partout, avec unsigned char, on prend un risque.

Discussions similaires

  1. Aide sur les structures
    Par scofild20 dans le forum C
    Réponses: 13
    Dernier message: 18/04/2007, 15h26
  2. Aide sur les structures.
    Par Fred2209 dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2006, 14h35
  3. Petite question sur les structures
    Par progfou dans le forum C
    Réponses: 5
    Dernier message: 21/06/2006, 15h49
  4. Aide sur les structure
    Par Yoshio dans le forum C
    Réponses: 7
    Dernier message: 18/02/2006, 12h56

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