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

Contribuez C++ Discussion :

64 bits et C++


Sujet :

Contribuez C++

  1. #61
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par voider
    Petite remarque, le standard c++ dicte cette regle sur la longueur des types: char <= short <= int <= long. Ce qui implique que cela risque de pouvoir varier d'un compilateur a l'autre. Sur 32 bit, la regle etait suivie (8, 16, 32, 32). Sur 64 bit aussi, mais peut etre certains compilateurs implanteront int = long = 64) Encore une fois, utilisez climits[/code]

    Bon, je dis ca de souvenir, il y a surement d'autre details importants
    Cela m'ettonne que le long soit éttendu alors que depuis le debut de l'informatique c'est l'int qui a servit de pointeur (int = taille du bus d'adresse). Le long a toujours quant a lui été calculé sur 32 bits (sur les machines 16 bits aussi) et le long long sur 64 (sur les machines 32 bits aussi)

    Quant a la regle (char <= short <= int <= long) elle n'est pas tout a fait exacte car en fait c'est :
    [unsigned] char = 8 bits, [unsigned] short = 2 char, [unsigned] long = 2 short, [unsigned] long long = 2 long, int = taille du bus d'adresses,
    pour les entiers et :
    [unsigned] single = 32 bits, [unsigned] double = 2 single, float = taille du bus d'adresses.
    pour les flottants.

    Jusque à present l'apparence conservait : char < short <= int <= long < long long, mais je ne pense pas que cela reste ainsi. Enfin comme vous l'avez dit ce ne sont que des valeurs arbitraires, basées sur les types physiques du processeur, mais ce ne sont que des conventions.

    Vous pouvez retrouver les types processeurs sur :
    www.sandpile.org

    A++ et bon Trolls (de Troy, biensur )

  2. #62
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Quant a la regle (char <= short <= int <= long) elle n'est pas tout a fait exacte car en fait c'est :
    [unsigned] char = 8 bits, [unsigned] short = 2 char, [unsigned] long = 2 short, [unsigned] long long = 2 long, int = taille du bus d'adresses,
    pour les entiers et :
    [unsigned] single = 32 bits, [unsigned] double = 2 single, float = taille du bus d'adresses.
    pour les flottants.
    C'est totalement faux.
    Le standard ne dit rien de tel.

    Il dit d'abord que sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).
    Ensuite une lecture plus fine permet de voir qu'un char fait au moins 8 bits, un short au moins 16 bits, un int au moins 16 bits, et un long au moins 32 bits.

    Et c'est tout.
    On peut très bien avoir sizeof(char) = sizeof(short) = sizeof(int) = sizeof(long) avec des bytes de 32 bits. C'est d'ailleurs le cas sur les DSP.
    Boost ftw

  3. #63
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Et sur solaris, j'ai des long de 64bits, tout comme les long long.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #64
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par loufoque
    C'est totalement faux.
    Le standard ne dit rien de tel......
    alors essaie de porter un programme qui a été developpé avec de grande valeur long et int en 32 voir 64 bit et porte les sur un système embarqué 16bit bit et pleure sur l'int car c'est lui qui fera 16bit alor que le long lui restera a 32 bit. tu peux essayer de le passer sur un système 8 bit mais je garanti pas que le long existe sur de tels systèmes mais la encore l'int fait 8bit (CQFD : int = largeur du bus d'adresses)

    quant a la taille du char elle fait 8 bit parce que les registres du processeur ne savent pas gerer des donnees < 8bit. C'est ce qui determine aussi les alignements de donnees en memoire centrales.

  5. #65
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par doccpu
    alors essaie de porter un programme qui a été developpé avec de grande valeur long et int en 32 voir 64 bit et porte les sur un système embarqué 16bit bit et pleure sur l'int car c'est lui qui fera 16bit alor que le long lui restera a 32 bit. tu peux essayer de le passer sur un système 8 bit mais je garanti pas que le long existe sur de tels systèmes mais la encore l'int fait 8bit (CQFD : int = largeur du bus d'adresses)
    Si tu relis bien ce que loufoque a écrit, tu ne le contredis pas, en revanche, lui oui.

  6. #66
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par Miles
    Si tu relis bien ce que loufoque a écrit, tu ne le contredis pas, en revanche, lui oui.
    quesce qui calcule si ce n'est le processeur ?
    la norme est entierrement basée sur lui et si vous voulez plus de detail alez voir le lien que j'ai donné plus haut !
    et si je le contredit en disant que int = taille bus d'adresse !

  7. #67
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Bon, un exemple qui montre que ça ne marche pas exactement comme tu le dis. On prend un processeur capable de fonctionner en 32 bits et en 64bits. En interne, c'est une seule largeur de bus unique et pourtant un int peut valoir 32bits ou 64bits.

  8. #68
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par Miles
    Bon, un exemple qui montre que ça ne marche pas exactement comme tu le dis. On prend un processeur capable de fonctionner en 32 bits et en 64bits. En interne, c'est une seule largeur de bus unique et pourtant un int peut valoir 32bits ou 64bits.
    comme tu l'a dit c'est un processeur capable de fonctionner en 32 ou 64 bit.

    en mode 32 il aura un bus d'adresse de 32bit et en 64 il aura un bus d'adresse de 64 bit

    essaye d'acceder a la memoire au dela des 32 bits en mode 32 bit et ca te fera bizare (a moins qu'en interne ton processeur passe en mode 64 bit pour acceder a la memoire)

    n'oublion pas la compatibilité ascendante (qui peut le plus peux le moins)

    et ca ne contredit pas ce que j'affirme sur le fait que tu peux metre 2^64 valeurs dans un "int" en mode 64bit alors que tu ne peux pas le faire dans un "long" (qui est limité a 2^32 valeurs) dans ce meme mode. Pour pouvoir utiliser 2^64 valeur avec des types fixes il faut utiliser "long long"

    donc ce que je disait a propos de l'int (int = taille du bus d'adresse) est toujours valide(en mode 32 il fait 32, en mode 64 il fait 64)

  9. #69
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Un long sur une archi 64bits peut valoir 64bits, je vient de faire le test.
    Le choix de la taille d'un type est puremet laissée au choix du concepteur du compilateur.

    Ah oui, depuis le Pentium pro, le bus d'adresse fait en 36bits.

  10. #70
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par doccpu
    en mode 32 il aura un bus d'adresse de 32bit et en 64 il aura un bus d'adresse de 64 bit
    essaye d'acceder a la memoire au dela des 32 bits en mode 32 bit et ca te fera bizare (a moins qu'en interne ton processeur passe en mode 64 bit pour acceder a la memoire)
    [...]
    donc ce que je disait a propos de l'int (int = taille du bus d'adresse) est toujours valide(en mode 32 il fait 32, en mode 64 il fait 64)
    Désolé d'intervenir, mais c'est complètement faux... ca fait très longtemps que les registres ALU des processeurs ne correspondent ni à la taille du bus d'addressage, ni à celle du bus de donnée !
    Certains processeurs peuvent utiliser un bus de données de 128 bits, un bus d'addressage de 64 bits, et des registres internes de 32 bits !

    Le Pentium-Pro avait un bus d'addressage 36 bits.
    Le 68000 avait un bus d'addressage de 24 bits, un bus de donnée de 32 bits et des registres internes de 16 bits !
    L'Itanium-64 propose int=32, long=64 et pourtant un addressage 64 bits si je ne m'abuse (ca fait longtemps que j'utilise plus int sauf pour des boucles simples aussi).

    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) est vériatablement la seule chose dont on soit sur !
    Après libre à chaque compilateur / profile-de-compilation de choisir les bonnes tailles.
    C'est bien pour cette raison que pratiquement tous (si ce n'est tous) les compilateurs ont introduit des types de longeur fixe (__int8 sous VC++ par exemple).

    Et loufoque a parfaitement raison... rien n'empeche de trouver un compilo avec tous les types qui font 32 bits !

    size_t est le seul type qui soit assuré de pouvoir contenir tout l'espace d'addressage.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #71
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par nicroman
    C'est bien pour cette raison que pratiquement tous (si ce n'est tous) les compilateurs ont introduit des types de longeur fixe (__int8 sous VC++ par exemple).
    int8_t etc. font partie du standard C99.
    Et aussi de C++0x.

    Citation Envoyé par doccpu
    donc ce que je disait a propos de l'int (int = taille du bus d'adresse) est toujours valide(en mode 32 il fait 32, en mode 64 il fait 64)
    Ce que tu ne sembles pas comprendre, c'est que le standard n'a aucune notion de "taille du bus d'adresse".
    Les seules et uniques restrictions sur les tailles, je te les ai données. Le reste, c'est des détails d'implémentation.
    Boost ftw

  12. #72
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par doccpu
    tu peux essayer de le passer sur un système 8 bit mais je garanti pas que le long existe sur de tels systèmes mais la encore l'int fait 8bit
    Une implémentation conforme a un int qui fait au moins 16 bits.

    (CQFD : int = largeur du bus d'adresses)
    Je ne vois aucune raison de fixer la taille d'un int en fonction de celle du bus d'adresse. (Au fait, les processeurs 8 bits ont généralement un bus d'adresse sur 16 bits)

    quant a la taille du char elle fait 8 bit parce que les registres du processeur ne savent pas gerer des donnees < 8bit.
    Un char fait au moins 8 bits. J'ai déjà utilisé une implémentation du C avec un char de 9 bits, des short de 18 bits et des int (et des long) de 36.

    C'est ce qui determine aussi les alignements de donnees en memoire centrales.
    Les contraintes d'alignement sont généralement le plus petit entre la taille de la donnée à transférer et la taille du bus de donnée.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #73
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par doccpu
    quesce qui calcule si ce n'est le processeur ?
    Et?

    la norme est entierrement basée sur lui et si vous voulez plus de detail alez voir le lien que j'ai donné plus haut !
    Ton lien ne concerne que les processeurs x86. Et la norme j'en ai un exemplaire, je sais ce qu'elle dit. Le choix est une conséquence de l'histoire du C, développé au départ sur un processeur 16 bits puis utilisé sur des processeur 36 et 32 bits. Tout cela bien avant que la famille x86 soit un facteur dans son évolution. L'article de Mashey vers lequel j'ai donné un lien est bien plus intéressant.

    et si je le contredit en disant que int = taille bus d'adresse !
    Les machines avec un int de 36 bits auxquelles je faisais allusion avait un bus d'adresse de 18 bits.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #74
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par nicroman
    Le 68000 avait un bus d'addressage de 24 bits, un bus de donnée de 32 bits et des registres internes de 16 bits !
    De mémoire, le 68000 avait des registres de 32 bits, mais un datapath de 16 bits.

    size_t est le seul type qui soit assuré de pouvoir contenir tout l'espace d'addressage.
    Non. void* est ce type. size_t peut être plus petit (sur une architecture segmentée comme le x86 en mode réel par exemple, size_t peut être sur 16 bits mais les pointeurs sur 32 bits -- avec seulement 20 bits efficaces), size_t est le type capable de contenir les tailles de tous les objets.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #75
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Non. void* est ce type. size_t peut être plus petit (sur une architecture segmentée comme le x86 en mode réel par exemple, size_t peut être sur 16 bits mais les pointeurs sur 32 bits -- avec seulement 20 bits efficaces), size_t est le type capable de contenir les tailles de tous les objets.
    Oui, c'est vrai... je me suis fourvoyé dans mes explications
    Au temps pour moi !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  16. #76
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Ton lien ne concerne que les processeurs x86.
    Et ?
    Citation Envoyé par Jean-Marc.Bourguet
    Et la norme j'en ai un exemplaire, je sais ce qu'elle dit. Le choix est une conséquence de l'histoire du C, développé au départ sur un processeur 16 bits puis utilisé sur des processeur 36 et 32 bits. Les machines avec un int de 36 bits auxquelles je faisais allusion avait un bus d'adresse de 18 bits.
    bon très bien je comprend mieux pourquois les programmes plantent. C'est clair que si les compilo font ce qu'ils veullent d'un processeur a l'autre...
    Donc il faudrais peut etre voir a reviser le sois disant "standard" qui ne l'est pas puisqu'il n'y a alors plus de taille fixe (a par peut etre le char (8bit)). Je suis dans le traitement de signal audio et si la norme est telle que vous la decrivez je ne pourais jamais passer en 64bit puisque nous on travaille sur des long de 32 bit, et que si ce parametre change d'une implementation a l'autre on aura des tailles d'echantillons variables d'un processeur a l'autre on vas avoir des surprises en mode 64 bit dans le traitement.

    Bonne réforme....

    et desolé d'avoir trollé mais le standard est lui même trop laid !

    Le jour ou j'apprend l'assembleur je refais tout les standards et l'informatique sera beaucoup plus stable !

  17. #77
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est pour ça qu'il y a les types autres genre int8, ...
    Et un char ne vaut pas forcément 8bts non plus.

  18. #78
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est justement pour assurer une portabilité que les tailles des différents types peuvent varier d'un compilateur à l'autre, d'un environnement à l'autre.

    Ce qui n'empêche pas d'avoir besoin ponctuellement de types de taille déterminée, par exemple quand il s'agit d'inter-opérer dans un format binaire avec un autre programme.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  19. #79
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par Miles
    C'est pour ça qu'il y a les types autres genre int8, ...
    Et un char ne vaut pas forcément 8bts non plus.
    donc si je fais je n'obtiendrais pas 8 * x bits dans mon tableau ?

    ça promet!

    C'est décidé, j'apprend l'assembleur !

  20. #80
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu peux avoir une garantie supplémentaire, fournie par ton environnement, qui t'assure que ça prend 8*x bits. Ou toute autre valeur * x bits. Le C ou le C++ en eux même ne garantissent rien là dessus. Si tu compiles ton code sur une autre architecture, il se peux que ça change.

    Maintenant, si tu bosses en assembleur, tu n'as aucune portabilité, donc la question ne se pose pas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25
  2. Main icon (16 bits)
    Par DR dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/09/2002, 08h23
  3. Cherche l'algo crc 16 bits
    Par icepower dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/08/2002, 13h27
  4. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34
  5. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31

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