Question

Quelle est la meilleure façon de déclarer un type entier qui fait toujours 4 octets sur n'importe quelle plate-forme ?Je ne m'inquiète pas de certains appareils ou anciennes machines dotés de 16 bits int.

Était-ce utile?

La solution

#include <stdint.h>

int32_t my_32bit_int;

Autres conseils

C ne s'intéresse pas beaucoup aux tailles exactes des types entiers, C99 introduit l'en-tête stdint.h , ce qui est probablement votre meilleur pari. Incluez cela et vous pouvez utiliser par exemple int32_t Bien sûr, toutes les plates-formes ne le supportent pas.

La réponse de

Corey est correcte pour le " meilleur " ;, à mon avis, mais un simple " int & "; fonctionnera également dans la pratique (étant donné que vous ignorez les systèmes avec un int de 16 bits). À ce stade, il faut que le code 32 bits soit si important que les fournisseurs de systèmes ne le modifient pas.

(Voir aussi pourquoi long est 32 bits sur beaucoup de systèmes 64 bits et pourquoi nous avons " long long ".)

L’un des avantages d’utiliser int32_t, c’est que vous ne perpétuez pas ce problème!

Vous pouvez rechercher une copie du document de Brian Gladman brg_types.h si vous n'avez pas stdint.h.

<=> va découvrir les tailles des différents entiers sur votre plate-forme et va créer des modifications de type pour les tailles courantes: 8, 16, 32 et 64 bits.

Vous devez inclure inttypes.h au lieu de stdint.h car long n'est pas disponible sur certaines plates-formes telles que Solaris et int inclut <=> pour vous sur des systèmes tels que Linux. Si vous incluez <=>, votre code est plus portable entre Linux et Solaris.

Ce lien explique ce que je dis: lien IBM sur les types de données portables

Si stdint.h n'est pas disponible pour votre système, créez le vôtre.J'ai toujours un fichier appelé "types.h" qui contient des typedefs pour toutes les valeurs signées/non signées de 8, 16 et 32 ​​bits.

également en fonction de vos plateformes cibles, vous pouvez utiliser autotools pour votre système de construction

il verra si stdint.h / inttypes.h existe et si ce n’est pas le cas, il créera les typefef appropriés dans un & "; config.h &";

stdint.h est le choix évident, mais il n’est pas nécessairement disponible.

Si vous utilisez une bibliothèque portable, il est possible qu’elle fournisse déjà des entiers portables à largeur fixe. Par exemple, SDL a Sint32 (S est pour & # 8220; signé & # 8221;) et GLib a gint32.

C99 ou version ultérieure

Utilisez <stdint.h>.

Si votre implémentation prend en charge les entiers 32 bits du complément à 2, elle doit définir int32_t.

Sinon, la meilleure solution est int_least32_t qui est un type entier pris en charge par l'implémentation d'au moins 32 bits, quelle que soit la représentation (complément à deux, complément à un, etc.).

Il y a aussi int_fast32_t qui est un type entier d'au moins 32 bits de large, choisi dans l'intention de permettre les opérations les plus rapides pour cette taille requise.

ANSI C

Vous pouvez utiliser long, dont la largeur minimale est de 32 bits est garanti par la plage minimale spécifiée par la norme.

Si vous préférez utiliser le plus petit type entier pour un nombre 32 bits, vous pouvez utiliser les instructions de préprocesseur suivantes avec les macros définies dans <limits.h>:

#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

#undef TARGET_MAX
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top