11
votes

Types de données primitives multiples multiples dans C ++

Contrairement à Java ou C #, les types de données primitifs en C ++ peuvent varier en taille en fonction de la plate-forme. Par exemple, int n'est pas garanti d'être un entier 32 bits. Divers environnements de compilateur définissent des types de données tels que uint32 ou DWORD à cette fin, mais il semble y avoir aucun standard inclure le fichier pour les types de données de taille fixe.

Quelle est la méthode recommandée pour atteindre une portabilité maximale?


0 commentaires

7 Réponses :


3
votes

Définir un type (E.G. int32) dans un fichier d'en-tête. Pour chaque plate-forme, utilisez un autre #Ifdef et assurez-vous que IN32 est un entier 32 bits. Partout dans votre code, utilisez Int32 et assurez-vous que lorsque vous compilez sur différentes plates-formes, vous utilisez la droite définie


0 commentaires

2
votes

Deux choses:

Tout d'abord, il y a un fichier d'en-tête appelé limites.h qui donne beaucoup de plate-forme utile information spécifique. Il donnera des valeurs max et min pour le type INT par exemple. De cela, vous pouvez déduire à quel point le type INT est.

Vous pouvez également utiliser la taille de l'opérateur au moment de l'exécution à ces fins.

J'espère que cela vous aidera. . .

k


0 commentaires

8
votes

Créer un fichier d'en-tête appelé type.h et définissez tous les types primitifs de taille fixe dont vous avez besoin (int32, uint32, uint8, etc.). Pour prendre en charge plusieurs plates-formes, vous pouvez utiliser #Ifdef ou avoir un répertoire séparé d'inclure pour chaque plate-forme (include_x86, include_x86_64, include_sparc). Dans ce dernier cas, vous auriez des configurations de construction séparées pour chaque plate-forme, ce qui aurait le droit d'inclure le répertoire dans leur chemin inclus. La deuxième méthode est préférable, selon le "The C ++ Gotchas" de Stephen Dewhurst.

juste un côté, si vous envisagez de passer des données binaires entre différentes plateformes, vous devez également vous soucier de l'ordre d'octet.


0 commentaires

5
votes

Une partie de la norme C99 était un fichier d'en-tête STDINT.H pour fournir ce type d'informations. Par exemple, il définit un type appelé uint32_t. Malheureusement, beaucoup de compilateurs ne soutiennent pas STDINT.H. La meilleure implémentation multi-plate-forme que j'ai vue de stdint.h est ici: http: // www. azillionmonkeys.com/qed/pstdint.h . Vous pouvez simplement inclure cela dans votre projet.

Si vous utilisez Boost, je pense que cela fournit également quelque chose d'équivalent à l'en-tête STDINT.


0 commentaires

2
votes

Il y a un en-tête STDINT.H défini par la norme C99 et (je pense) une variante ou une autre de ISO C ++. Cela définit de beaux types comme int16_t, uint64_t, etc ... qui sont garantis pour avoir une taille et une représentation spécifiques. Malheureusement, il est de la disponibilité n'est pas exactement standard (Microsoft en particulier était un fragège pédagogique ici).

La réponse simple est ceci, ce qui fonctionne sur chaque architecture adressable de 32 ou 64 bits, je suis au courant de:

  • Toutes les variables de caractère sont 1 octet
  • toutes les variables courtes sont 2 octets
  • Toutes les variables int sont 4 octets
  • Ne pas utiliser de "long", ce qui est de taille indéterminée.
  • Tous les compilateurs connus avec support pour les mathématiques 64 bits permettent "de long long" comme type natif de 64 bits.

    Sachez que certains compilateurs 32 bits ne disposent pas d'un type de 64 bits, il suffit donc de vous limiter à 64 bits et à un ensemble de compilateurs plus petits (qui comprend GCC et MSVC, la plupart des gens ont gagné ' t se soucie de ce problème).


3 commentaires

J'ai vu int comme 64 bits sur certaines plates-formes. Long Long Long n'est pas standard en C ++ et n'est garanti que de la taille égale ou supérieure à celle de long . Char sur certains systèmes rares est de 16 bits. Ce ne sont pas des hypothèses portables que vous faites. C'est pourquoi tant de logiciels ont des problèmes lorsqu'ils sont portés à 64 bits de Win32 ou de Linux-32.


Ce type de réponse est la raison pour laquelle j'ai commencé avec la réponse portable. Mais je suis désolé, votre pédantisme manque de preuve. Je ne suis au courant d'aucune plate-forme nulle part qui définit Int à 64 bits. "long long" est en effet non standard. Pourtant, de manière amusante, il est beaucoup plus portable entre les compilateurs que n'importe quel type standard 64 bits; Il m'atténue que les gens ne le reconnaissent pas. L'objectif est la portabilité et non des normes. Ma réponse concernait des préoccupations de la portabilité praticienne.


Townvoted. "Je ne suis au courant d'aucune plate-forme nulle part qui définit Int à 64 bits" manque de connaissances! = Réponse correcte.



11
votes

J'ai trouvé cet en-tête particulièrement utile: Boost CstDint

Habituellement mieux que d'inventer la roue (qui entraîne la maintenance et les tests).


0 commentaires

2
votes

Si son nom commence par deux soulignes (__), un type de données n'est pas standard.

__ int8 (non signé __int8)

__ int16 (non signé __int16)

__ int32 (non signé __int32)

__ int64 (non signé __int64)

essayer d'utiliser boost / cstdint.hpp


0 commentaires