64 votes

Types de données à longueur fixe en C/C++

J'ai entendu dire que la taille de types de données tels que int peut varier selon les plateformes.

Ma première question est la suivante : quelqu'un peut-il donner un exemple de ce qui ne va pas lorsque le programme suppose un int est de 4 octets, mais sur une autre plate-forme, il est de 2 octets ?

Une autre question que j'avais est liée. Je sais que des gens résolvent ce problème avec des typedefs , comme vous avez des variables comme u8 , u16 , u32 - dont la taille est garantie à 8, 16 ou 32 bits, quelle que soit la plate-forme. Ma question est la suivante : comment cela est-il généralement réalisé ? stdint bibliothèque - je suis curieux manuellement, comment peut-on imposer qu'un type soit toujours disons 32 bits quelle que soit la plateforme ??)

5voto

c45207 Points 1825

Je suis curieux de savoir comment on peut imposer qu'un type soit toujours, disons, de 32 bits, quelle que soit la plate-forme ?

Si vous voulez que la compilation de votre programme C++ (moderne) échoue si un type donné n'est pas de la largeur attendue, ajoutez une balise static_assert quelque part. Je l'ajouterais autour de l'endroit où les hypothèses sur la largeur du type sont faites.

static_assert(sizeof(int) == 4, "Expected int to be four chars wide but it was not.");

chars sur les plateformes les plus utilisées sont de 8 bits, mais toutes les plateformes ne fonctionnent pas de cette manière.

3voto

Nemanja Boric Points 11853

Eh bien, premier exemple - quelque chose comme ça :

int a = 45000; // both a and b 
int b = 40000; // does not fit in 2 bytes.
int c = a + b; // overflows on 16bits, but not on 32bits

Si vous regardez dans cstdint vous trouverez comment tous les types de taille fixe ( int8_t , uint8_t etc.) sont définis - et la seule chose qui diffère entre les différentes architectures est ce fichier d'en-tête. Ainsi, sur une architecture int16_t pourrait être :

 typedef int int16_t;

et sur un autre :

 typedef short int16_t;

Il existe également d'autres types, qui peuvent être utiles, comme par exemple : int_least16_t

2voto

Juraj Blaho Points 8134
  1. Si un type est plus petit que vous ne le pensez, il se peut qu'il ne soit pas en mesure de stocker une valeur dont vous avez besoin.
  2. Pour créer des types à taille fixe, vous devez lire la documentation relative aux plates-formes à prendre en charge, puis définir des types à taille fixe. typedef sur la base de #ifdef pour les plates-formes spécifiques.

2voto

legends2k Points 6380

Quelqu'un peut-il donner un exemple de ce qui ne va pas, lorsque le programme suppose qu'un int est de 4 octets, mais que sur une autre plate-forme, il est de 2 octets ?

Supposons que vous ayez conçu votre programme pour lire 100 000 entrées, et que vous le comptiez à l'aide d'un programme de type unsigned int en supposant une taille de 32 bits (les entiers non signés de 32 bits peuvent compter jusqu'à 4 294 967 295). Si vous compilez le code sur une plate-forme (ou un compilateur) avec des entiers de 16 bits (les ints non signés de 16 bits ne peuvent compter que jusqu'à 65 535), la valeur s'enroulera au-delà de 65535 en raison de la capacité et indiquera un compte erroné.

1voto

M M. Points 29201

Les compilateurs sont responsables du respect de la norme. Lorsque vous incluez <cstdint> o <stdint.h> ils doivent fournir des types conformes à la taille standard.

Les compilateurs savent qu'ils compilent le code pour quelle plate-forme, ils peuvent alors générer des macros ou des magies internes pour construire le type approprié. Par exemple, un compilateur sur une machine 32 bits génère __32BIT__ et, auparavant, il y avait ces lignes dans la macro stdint fichier d'en-tête :

#ifdef __32BIT__
typedef __int32_internal__ int32_t;
typedef __int64_internal__ int64_t;
...
#endif

et vous pouvez l'utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X