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

Langage C++ Discussion :

À quoi sert le type long long ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut À quoi sert le type long long ?
    Un type dont l'utilité m'échappe. Je m'explique.
    Voyez ce tableau :

    Vous aurez sûrement compris qu'il indique la taille des principaux types de C/C++ selon l'architecture du système d'exploitation.
    Or on constate une chose : quand le type long long existe, soit le type long a la même taille qu'int, soit la même taille qu'un long long. C'est idiot ?
    Si par exemple pour win64 et win32, short faisait 16 bits, int 32 et long 64, ce serait bien plus simple, non ? Eh ben, short fait 16 bits, int et long 32, et long long 64.
    Du coup le type long seul ne sert à rien, il faut le doubler pour ne pas avoir la même chose qu'un int.

    Il y a pas mal de chose qui me sont obscures en C/C++, mais là...il va falloir que quelqu'un m'éclaire.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    En fait, tu poses la question pour le mauvais type : le type long long est le type primitif pour lequel il y a la garantie (ou peu s'en faut) qu'il sera composé de 64bits, alors que, comme l'indique le tableau, le type long pourra selon le cas représenter une donnée 32 bits ou une donnée 64 bits.

    Par contre, ce qui est peut être intéressant, c'est de connaitre le pourquoi de cette différence

    Ce qui se passe, c'est qu'il existe différentes architectures de processeurs. Certaines d'entre-elles étaient déjà des architectures 64bits bien longtemps avant l’engouement pour la chose qui est apparu au début des années 2000.

    La norme a à l'origine prévu le type long pour ce genre d'architecture, à une époque ou l'on estimait (à tort) que 32bits seraient amplement suffisants pour représenter n'importe quelle valeur "justifiée". Il était donc "normal" que le type long soit codé sur 64 bits pour ces architectures et qu'il soit "limité" à 32 bits sur les architecture 32 bits

    Par la suite, les architecture 64 bits se sont généralisées. Microsoft qui n'y croyait pas au début s'est d'ailleurs bien fait avoir et a du prolonger le support de XP le temps de fournir un OS 64 bits .

    L'existence de nouvelles architectures, permettant l'utilisation de plus de bits pour représenter l'ensemble des données manipulées par le processeur, a forcément eu un impact au niveau des types primitifs : on ne pouvait pas "réutiliser" un type existant pour représenter ce nouveau type de données car cela aurait eu de l'influence sur toute la base de code existante. La décision de créer le type long long est justifiée par ce dernier point et fait que, oui, il est possible que long et long long représentent les données sous la forme d'un nombre identique de bits... ou pas. Mais long long te donne la "garantie" d'utiliser les 64 bits (alors que rien n'est sur pour le type long).

    Notes enfin que le tableau est normalement purement informatif : la taille des types primitifs est implementation dependant, la norme se contentant de préciser que, dans la liste des types qu'est char, short, int, long et long long, chaque type est d'une taille au minimum suffisante pour permettre la représentation du type qui le précède dans la liste. Mais le nombre de bits par byte et le nombre de byte n'est défini absolument nulle part, ni dans la norme C, ni dans la norme C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    En complément de la réponse de Koala, si tu souhaites maîtriser la taille de tes entiers (c’est le cas si tu travailles sur des grands entiers, par exemple), tu peux utiliser les types std::intXX_t

    Cf http://en.cppreference.com/w/cpp/types/integer pour plus de détails (en anglais, malheureusement).

  4. #4
    Invité
    Invité(e)
    Par défaut
    D'accord, merci pour ces précisions !
    Cependant, heu...
    Citation Envoyé par koala01
    le nombre de bits par byte [...] n'est défini absolument nulle part
    Un byte, ce n'est pas un octet ? Ça contient toujours 8 bits, non ?

    @white_tentacle
    Je le savais déjà mais merci quand même


    Autre question : si j'utilise un long long ou un std::int64_t et que j'essaie de faire tourner le programme sur une architecture 32 bits, ça va poser problème ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Citation Envoyé par Neoflash Okashi Voir le message
    Un byte, ce n'est pas un octet ? Ça contient toujours 8 bits, non ?
    Un byte, c'est au moins un octet (du moins, en C et C++). CHAR_BIT est toujours au moins 8.

    Autre question : si j'utilise un long long ou un std::int64_t et que j'essaie de faire tourner le programme sur une architecture 32 bits, ça va poser problème ?
    Si ça compile, c'est que la plate-forme supporte le type. Par contre, sous une architecture 32 bits, tu ne peux pas stocker un int64_t dans un intptr_t.
    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
    Invité
    Invité(e)
    Par défaut
    Si un byte, c'est au moins un octet, comment on dit octet en anglais ? (c'est une vraie question)

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais le nombre de bits par byte et le nombre de byte n'est défini absolument nulle part, ni dans la norme C, ni dans la norme C++
    Bonjour

    N'y a-t-il pas quand-même un nombre "minimal imposé" style "un short fera toujours au-moins 16 bits" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Il me semble que c'est plus un détail d'implémentation, conséquence des maxima minimaux définis par la norme et du fait que les ordis d'aujourd'hui soient binaires, qu'une vraie règle de la norme.

    Je ne sais plus si la norme oblige que les entiers soient codés en binaire (je sais qu'elle n'oblige pas que les flottants soient en IEEE 754). Sur un ordi ternaire, la taille minimale d'un unsigned short serait 11 trits.
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    la norme ne pose que quelques exigences: l'intervalle de valeurs minimal possible, et un rapport entre les tailles des types.

    ainsi sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)
    et unsigned char doit pouvoir représenter l'intervalle [0; 255]

    Il y a une implication directe du genre sizeof(short)≥16bits

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par leternel Voir le message
    la norme ne pose que quelques exigences: l'intervalle de valeurs minimal possible, et un rapport entre les tailles des types.

    ainsi sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)
    et unsigned char doit pouvoir représenter l'intervalle [0; 255]

    Il y a une implication directe du genre sizeof(short)≥16bits
    Il n'y a aucune implication directe ou que ce soit, vu que sizeof(short) est plus grand ou égal à sizeof(char). Autrement dit, il serait tout à fait possible de trouver une implémentation dans laquelle la taille du short (et de tous les types potentiellement plus grands) serait égale à celle d'un char

    Quant à l'intervalle minimal, je crois plutôt qu'il se situe dans la fourchette [0,127] car, à l'origine la table ASCII ne définit que les caractères dont les indices sont compris dans cet intervalle (avec 127 ou b1111111 comme symbole "delete"). J'ai d'ailleurs eu l'occasion de "jouer" avec des plaquettes de simulation dont les bytes étaient de 7 bits (bon, c'étaient des ancêtres, déjà quand je les ai vues, mais quand meme )

    Or, l'intervalle [0,255] est spécifique à l'intervalle d'une valeur binaire codée sur 8 bits qui correspond à la table ASCII étendue et, comme par hasard (enfin pas si tant que cela ) à la taille du byte sur les architectures compatible IBM depuis les premiers processeurs du genre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 307
    Par défaut sizeof int, long,...
    Citation Envoyé par leternel Voir le message
    la norme ne pose que quelques exigences: l'intervalle de valeurs minimal possible, et un rapport entre les tailles des types.

    ainsi sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)
    et unsigned char doit pouvoir représenter l'intervalle [0; 255]

    Il y a une implication directe du genre sizeof(short)≥16bits
    short fait au moins 16bits, long fait au moins 32bits, long long au moins 64 bits. http://en.wikipedia.org/wiki/C_data_types#Size

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

Discussions similaires

  1. A quoi sert le type .ToString("F")?
    Par Naceur84 dans le forum C#
    Réponses: 8
    Dernier message: 01/09/2011, 09h33
  2. Réponses: 1
    Dernier message: 03/04/2009, 14h26
  3. code contenant un type long long
    Par Bayard dans le forum C
    Réponses: 3
    Dernier message: 02/10/2007, 14h02
  4. Réponses: 6
    Dernier message: 06/12/2005, 16h54
  5. DBLink et types LONG/LONG RAW
    Par bchristo dans le forum Administration
    Réponses: 7
    Dernier message: 28/04/2004, 12h46

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