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 :

longueur maximale des entiers


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 11
    Points
    11
    Par défaut longueur maximale des entiers
    Bonjour,
    Dans mes manuels de C, j'ai toujours lu qu'un entier était limité à environ 32000, et un entier long à environ 64000. Or, dans la version de C que j'utilise actuellement, je peux utiliser des entiers avec des valeurs supérieures à 1000000 sans problème! Existe-t-il donc plusieurs versions de C, et comment puis-je savoir quelle est la limite des variables?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 187
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 187
    Points : 17 135
    Points
    17 135
    Par défaut
    En fait, la norme parle d'intervalle de valeur garanti.

    J'ai cette référence pour le C++, qui doit être valable pour le C.
    En gros, un int peut toujours contenir 16bits, c'est à dire [-2^15 .. 2^15 -1] ou encore [-32768 .. 32767]

    Mais chaque archi et compilateur peuvent fournir plus.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    En attente de confirmation mail

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 639
    Points : 2 347
    Points
    2 347
    Par défaut
    Entiers limités à 32000 ? (ce serait peu)

    A 32000 octets ? (ce serait énorme)


    Chez moi les signed short sont entre -32768 et 32767 ; les unsigned short entre 0 et 65535
    => les short sont donc sur 16 bits

    Les signed int sont entre -2147483648 et +2147463647 et les unsigned int entre 0 et 2^32 - 1.
    => les int sont donc sur 32 bits

    Chez moi...

    Il peut y avoir des différences selon les machines et les compilateurs. Mais en 2014, des int sur 16 bits, ça me parairait un peu... peu.

    Il y a une constante MAX_INT (ou INT_MAX ?) qui te rensignera sur la valeur max d'un int.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Comme l'a dit leternel, la norme garantie une plage minimale mais elle peut être plus grande. Il faudrait donc dire "limité au minimum".

    Les ints sont codés de manière signées sur 16 bits, tout comme les shorts. Souvent, les premiers sont sur la taille "naturelle" de la machine (32 bits sur une machine 32 bits, 64 bits sur une machine 64 bits, etc).

    Il y a bien une constante INT_MAX, comme signalé par CodeurPlusPlus. Elle est définie dans limits.h, avec d'autres constantes intéressantes. Le contenu de ce fichier est spécifique au compilateur et l'architecture cible et te donnera ce que tu peux vraiment utiliser dans ton cas à toi.

    PS:
    Mais en 2014, des int sur 16 bits, ça me parairait un peu... peu.
    Sur PC, oui Mais il existe des microcontrôleurs 8 bits pour lesquels c'est encore le cas (encore une fois, cela peut dépendre du compilateur sur la même cible).

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    Comme les autres l'ont expliqué ça dépend de ton architecture. La seule chose qui est portable c'est la relation d'ordre entre les types.

    Si tu veux être certain de connaître la taille des entiers que tu utilises je te conseil d'utiliser la bibliothèque stdint.h (int pas in ^^) et plus particulièrement les types int8_t, uint8_t, int16_t... Tu as aussi des macros pour la limite de chaque type.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par schonai Voir le message
    La seule chose qui est portable c'est la relation d'ordre entre les types.
    Et les minimums garantis. Le fait qu'un int ne sera jamais plus petit que 16 bits (sure une plate-forme conforme à la norme) est portable.

    Dans mes manuels de C, j'ai toujours lu qu'un entier était limité à environ 32000, et un entier long à environ 64000
    Tu te souviens mal: La limite à "environ 64000" est le minimum que doit supporter un entier non-signé, et non pas un entier long (quoi doit, au minimum, supporter une limite à "environ 2 milliards").


    Bien sûr, il y a une différence entre ce que la norme garantit supporter et ce que la plupart des plate-formes supportent: Les plate-formes modernes tendent à supporter plus.
    Type Norme PC moderne
    short -32,767 à +32,767 -32,768 à +32,767
    unsigned short 0 à +65,535 0 à +65,535
    int -32,767 à +32,767 -2,147,483,648 à +2,147,483,647
    unsigned int 0 à +65,535 0 à +4,294,967,295
    long -2,147,483,647 à +2,147,483,647 -2,147,483,648 à +2,147,483,647
    (-9 trillions à +9 trillons sur certaines plate-formes 64 bits)
    unsigned long 0 à +4,294,967,295 0 à +4,294,967,295
    (0 à +18 trillions sur certaines plate-formes 64 bits)
    long long -9.223.372.036.854.775.807 à +9.223.372.036.854.775.807 -9.223.372.036.854.775.808 à +9.223.372.036.854.775.807
    unsigned long long 0 à +18.446.744.073.709.551.615 0 à +18.446.744.073.709.551.615
    Un point intéressant est la différence de 1 sur la valeur la plus négative: Elle vient du fait que la norme ne spécifie pas comment les nombres négatifs doivent être représentés, et doit donc spécifier une valeur supportée par la plupart des représentations; alors que la représentation employée par un PC moderne, le complément à 2, supporte une valeur de plus.
    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.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par barnouin Voir le message
    Bonjour,
    Dans mes manuels de C, j'ai toujours lu qu'un entier était limité à environ 32000, et un entier long à environ 64000. Or, dans la version de C que j'utilise actuellement, je peux utiliser des entiers avec des valeurs supérieures à 1000000 sans problème! Existe-t-il donc plusieurs versions de C, et comment puis-je savoir quelle est la limite des variables?
    En faite la valeur maximal d'un entier n'est liée qu'au nombre de bit sur lequel il est codée, et si ce dernier est signée ou pas.
    Donc, un short qui est normalement codée sur 16 bit soit 2^(16) valeurs possible (65536) {[0-65535](non signée), [-65536/2, 65536/2-1]( signée)}.

    Mais dans la norme j'ai compris ceci:
    sizeof( char)<=sizeof( short)<=sizeof( long)<=sizeof( long long)
    Dernière modification par Invité ; 06/09/2014 à 17h40.

Discussions similaires

  1. [Visual I/O] Longueur maximale des lignes dans un fichier texte
    Par baziterry dans le forum Autres IDE
    Réponses: 2
    Dernier message: 08/03/2015, 08h42
  2. Toutes les sous-séquences croissantes et maximales d'une séquence des entiers
    Par hassanJava dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 23/04/2008, 11h19
  3. Réponses: 2
    Dernier message: 22/04/2008, 13h45
  4. Réponses: 9
    Dernier message: 29/07/2003, 14h41
  5. Réponses: 9
    Dernier message: 17/01/2003, 11h45

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