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 :

taille du type int


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut taille du type int
    bonjour.
    Est-ce que selon vous le test lors du préprocesseur:
    #if ( UINT_MAX == 0xFFFFFFFF )
    est suffisant pour m'assurer que les "unsigned int" sont codé sur 32 bits sur la machine sur laquelle je compile? (ou est-ce que si ce n'est pas le cas il risque d'y avoir un cast ou je ne sais quoi qui ferait que ce test puisse passer quand même?)
    Merci

    (Pour connaître la taill des char, il y a CHAR_BIT. (limits.h)
    Mais il n'existe pas de INT_BIT ni de SHORT_BIT.)

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Par défaut
    Bonjour,

    Un sizeof(int) retourne quoi ?

  3. #3
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    hello,
    J'y avais pensé:
    le sizeof(int) retourne bien 4, mais je souhaite faire le test lors du preprocesseur et je ne peux pas faire dele compilo me retourne:
    fatal error C1017: invalid integer constant expression

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Ben oui, sizeof est deja gere par le pre-processeur, et on ne peut pas appliquer le pre-processeur sur lui-meme.
    La question est, pourquoi tu as besoin de t'assurer de la taille d'un int dans ton code source? Normalement, c'est le Makefile qui s'occupe de ce genre de detail et prepare des codes (ou des compilations) differents selon la plateforme cible.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais justement, l'on n'est pas forcément sûr des définitions.
    Pour vérifier en compile-time, tu peux utiliser ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int COMPILE_TIME_ASSERT_SIZEOF_INT[ (sizeof(int)==4) ? 1 : -1 ];
    Ceci produit une erreur de compilation (tableau de taille négative) si la condition sizeof(int)==4 n'est pas vérifiée.
    Par contre, je n'ai pas trouvé moyen de vérifier l'endianness d'un système en compile-time. Pour cela, il faudrait jouer avec des pointeurs, et les données pointées par un tableau converti en pointeur ne sont pas une constante connue à la compilation.

    DaZumba: L'erreur n'est-elle pas justement que sizeof n'est PAS géré par le préprocesseur, mais par le compilateur lui-même ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Médinoc
    DaZumba: L'erreur n'est-elle pas justement que sizeof n'est PAS géré par le préprocesseur, mais par le compilateur lui-même ?
    Oui -- mon post etait mal ecrit. Voir cette explication qui est plus detaillee !

  7. #7
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Hello,

    En gros, j'écris un code qui va causer à un device via le port série. le protocole utilisé pour parler avec ce device est basé sur des mots de 8 bits.

    ça me convient parfaitement, j'utilise des unsigned char (uint8) puisque chez moi ils font 8 bits (CHAR_BIT == 8)
    Et mon code prépare des messages dans un buffer: uint8 buffer[MAX_SIZE]

    Si un jour un char ne fait pas 8 bits sur une machine, ça risque de ne plus marcher. (selon la norme, un char fait "au minimum" 8 bits)

    Je souhaite donc simplement addresser un message au programmeur qui reprendra mon code dans quelque années, quand le programme ne marchera plus et que personne ne saura pourquoi. Le but c'est qu'il reprenne le code, le compile et reçoive un message qui dit
    #if(CHAR_BIT != 8)
    #error "char type on this computer is not 8 bit long"
    #endif
    Comme ça il saura directement pourquoi ça marche plus et il sera a même de faire les modif necessaires.

    jusque la tout va bien, j'ai CHAR_BIT pour controler

    Mais il y a certains cas ou ça m'arrangerait de faire la même vérification pour des types de 16 et 32 bits.
    Pour l'instant, la solution que j'ai trouvé c'est le test ci-dessus.
    La question c'est: est-ce que ce test échouera si "unsigned int" ne fait pas 32 bits?
    Selon moi, oui, mais je souhaite une confirmation

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu utilises mes tests, je te conseille quand même d'utiliser un type "avec taille" plutôt que int.

    Genre, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef int INT32;
     
    typedef int COMPILE_TIME_ASSERT_CHAR_BIT[ (CHAR_BIT==8) ? 1 : -1 ];
    typedef int COMPILE_TIME_ASSERT_SIZEOF_INT32[ (sizeof(INT32)==4) ? 1 : -1 ];
    Quand le second test foire, il suffit alors de changer le typedef et recompiler...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Biosox
    En gros, j'écris un code qui va causer à un device via le port série. le protocole utilisé pour parler avec ce device est basé sur des mots de 8 bits.

    ça me convient parfaitement, j'utilise des unsigned char (uint8) puisque chez moi ils font 8 bits (CHAR_BIT == 8)
    Et mon code prépare des messages dans un buffer: uint8 buffer[MAX_SIZE]

    Si un jour un char ne fait pas 8 bits sur une machine, ça risque de ne plus marcher. (selon la norme, un char fait "au minimum" 8 bits)
    Il n'y a aucune raison que ça ne fonctionne pas. Sur un DSP où les char font 16-bit, les chaines de caractères prennent plus de place que nécessaire (un DSP, c'est pas fait pour traiter des chaines de caractères), mais le fonctionnement reste conforme.

    Tu te crées des soucis pour rien. Il faut au contraire savoir écrire du code portable qui fait qu'on a absolument pas à faire attention à ce genre de détails sans intérêt.

    Pour répondre à ta question initiale, si tu as besoin de 32-bit, tu utilises un unsigned long. Point. Ca, c'est 'savoir écrire du code portable'.

    Utiliser un int pour 32-bit, c'est sortir le gros bâton pour se faire taper dessus (ou se tirer une balle dans le pied...)

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DaZumba
    Ben oui, sizeof est deja gere par le pre-processeur,
    Euh, non. le préprocésseur est évalué dans les phases 1 ou 2 de la compilation. Les expression constantes dans les phase 3 ou 4 ...

    On ne peut donc pas utiliser une expression constante calculée dans le préprocesseur. (Par contre on peut faire un assert() qui se déclenchera éventuellement à l'exécution).

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Biosox
    bonjour.
    Est-ce que selon vous le test lors du préprocesseur:

    est suffisant pour m'assurer que les "unsigned int" sont codé sur 32 bits sur la machine sur laquelle je compile? (ou est-ce que si ce n'est pas le cas il risque d'y avoir un cast ou je ne sais quoi qui ferait que ce test puisse passer quand même?)
    Merci

    (Pour connaître la taill des char, il y a CHAR_BIT. (limits.h)
    Mais il n'existe pas de INT_BIT ni de SHORT_BIT.)
    Oui et non. Ca suffit pour determiner que les valeurs des unsigned sont codees sur 32 bits mais ne va pas trouver les cas ou unsigned fait 32 bits avec des bits de padding et va trouver les cas ou unsigned fait plus de 32 bits mais les bits supplementaires sont des bits de padding. Il n'est pas invraissemblable que ca te convienne mieux que l'equivalent d'un sizeof(int)*CHAR_BIT == 32.

  12. #12
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Merci a tous.

    Médinoc: c'est futé. J'avais déja vu une tecnihque du genre, pas avec un typedef, mais avec une declaration de fonction qui prenait comme argument un tableau avec un indice négatif. le typedef est bien plus simple. N'ayant jamais utilisé typedef pour créer un "type tableau", je n'y avais pas pensé.

    Jean-Marc.Bourget, merci pour ces précisions. Dans ce cas je pense que je vais en rester avec mon test finalement


  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Remercie Microsoft, j'ai trouvé ça dans leurs headers
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Biosox
    Est-ce que selon vous le test lors du préprocesseur:
    <...>
    est suffisant pour m'assurer que les "unsigned int" sont codé sur 32 bits sur la machine sur laquelle je compile?
    A quoi ça sert de savoir si un unsigned int est codé sur 32-bit ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/05/2008, 23h23
  2. Réponses: 2
    Dernier message: 27/02/2007, 18h17
  3. Réponses: 9
    Dernier message: 06/07/2005, 14h20
  4. Quelle taille pour un int ?
    Par elitost dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 14/02/2005, 08h20
  5. Taille de types ?
    Par gOgHi dans le forum Oracle
    Réponses: 12
    Dernier message: 27/10/2004, 17h56

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