web-dev-qa-db-fra.com

Comment déclarer un entier 32 bits en C

Quel est le meilleur moyen de déclarer un type entier toujours à 4 octets sur n’importe quelle plate-forme? Je ne m'inquiète pas pour certains appareils ou vieilles machines qui ont une int 16 bits.

60
ZZ Coder
#include <stdint.h>

int32_t my_32bit_int;
98
Corey D

C ne se préoccupe pas beaucoup de la taille exacte des types entiers, C99 introduit l’en-tête stdint.h , qui est probablement votre meilleur choix. Incluez cela et vous pouvez utiliser par exemple int32_t. Bien sûr, toutes les plates-formes ne peuvent pas supporter cela.

12
nos

La réponse de Corey est correcte pour "meilleur", à mon avis, mais un simple "int" fonctionnera également dans la pratique (étant donné que vous ignorez les systèmes avec 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, cependant, est que vous ne perpétuez pas ce problème!

11
Brooks Moses

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

brg_types.h va découvrir les tailles des différents entiers sur votre plate-forme et va créer des typedefs pour les tailles courantes: 8, 16, 32 et 64 bits.

5
cfrantz

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

Ce lien explique ce que je dis: lien HP sur inttypes.h

Et ce lien contient un tableau indiquant pourquoi vous ne souhaitez pas utiliser long ou int si vous avez l'intention qu'un certain nombre de bits soient présents dans votre type de données . lien IBM concernant les types de données portables

5
Cutlasj

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 a typedefs pour toutes les valeurs signées/non signées 8, 16 et 32 ​​bits.

0
Robert

en fonction également de vos plates-formes 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, créera les typedefs appropriés dans un "config.h"

0
Spudd86

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 signifie «signé») et GLib a gint32.

0
Bastien Léonard

C99 ou plus tard

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, 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 existe également int_fast32_t, qui est un type entier d'au moins 32 bits de largeur, choisi dans le but de permettre les opérations les plus rapides pour cette taille requise.

ANSI C

Vous pouvez utiliser long, dont la largeur minimale est garantie à 32 bits en raison des exigences de portée minimales spécifiées 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
0
Veltas