Question

Je suis conscient que la spécification du langage C ne dicte pas la taille exacte de chaque type entier (par exemple, int).

Ce que je me demande, c'est: Y a-t-il un moyen en C (pas C ++) de définir un type entier avec une taille spécifique qui assure qu'il sera identique dans différentes architectures? J'aime:

typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>

Ou tout autre moyen permettant de compiler d'autres parties du programme sur une architecture différente.

Était-ce utile?

La solution

Ce que vous voulez, c’est <stdint.h>, que les compilateurs conformes à la norme C (" C99 ") seront implémentés. Malheureusement, cela n'inclut pas Microsoft. Heureusement, un projet open source fournit un int32_t pour Windows, voir msinttypes .

Cela vous permettra d'utiliser uint32_t et <=>, plus 8, 16 et 64, et bien d'autres.

Remarque: le fichier d'en-tête n'est pas facultatif dans la norme, cependant, la plupart des types dans l'en-tête sont individuellement facultatifs. Certains ne le sont pas. Les types les plus couramment utilisés sont les types facultatifs, mais rien ne vous empêche d’utiliser les types requis. Si une implémentation fournit l’en-tête, c’est en pratique qu’ils définissent tous les types.

Autres conseils

C99, dans stdint.h , définit des types tels que int8_t et int16_t .

Non, la norme C spécifie les tailles minimales pour les types intégraux mais ne donne aucune garantie sur les tailles maximales.

Une implémentation doit fournir les types intN_t si des types de cette taille sont disponibles. Je mentionne simplement que puisque vous avez une balise multiplate-forme - une implémentation qui n’a pas un type de largeur de bits correcte n’a pas besoin de fournir ces types.

Vous pouvez généralement sélectionner (avec le paramètre défini avec, par exemple, cc -D_INT16_IS_INT et #ifdef s) le type correct à utiliser pour une taille de bit spécifique. Vous pouvez définir les définitions requises pour chaque plate-forme que vous souhaitez prendre en charge avec du code C à l'aide de CHAR_BIT et de sizeof () .

La section pertinente du brouillon c1x (n1362) est la suivante:

7.18.1.1 Types entiers de largeur exacte

  1. Le nom de typedef intN_t désigne un type entier signé signé avec une largeur N , aucun bit de remplissage et une représentation de complément à deux. Ainsi, int8_t désigne un type entier signé avec une largeur d’exactement 8 bits.

  2. Le nom de typedef uintN_t désigne un type entier non signé de largeur N . Ainsi, uint24_t désigne un type entier non signé ayant une largeur de 24 bits exactement.

  3. Ces types sont facultatifs. Cependant, si une implémentation fournit des types entiers avec des largeurs de 8, 16, 32 ou 64 bits, aucun bit de remplissage et (pour les types signés) ayant une représentation de complément à deux, elle doit définir les noms de référence de type correspondants.

En ce qui concerne la sélection des types, cela devrait suffire:

#ifdef INT32_IS_SHORT
    typedef short INT32
#endif
#ifdef INT32_IS_INT
    typedef int INT32
#endif
#ifdef INT32_IS_LONG
    typedef long INT32
#endif

À moins que vous ne vérifiiez chaque plate-forme avec #ifdef , je doute que cela soit facilement possible. Mais beaucoup de bibliothèques font déjà cette tâche pour vous. Pour MSVC, il s'agit de __ int8 , __ int16 , & amp; c. La bibliothèque GTK a des typedefs similaires.

Vous pouvez consulter pstdint.h . C’est une implémentation portable de stdint.h et ne nécessite pas la prise en charge du compilateur C99.

Pour autant que je sache, la réponse est non. Nous codons pour différentes plates-formes et nous utilisons simplement les typedefs pour les plates-formes spécifiques en utilisant # if / # else. Par exemple sur Win32: typedef int int32;

Vous pouvez toujours écrire une bibliothèque arithmétique qui utilise des vecteurs de caractères non signés pour les nombres. De cette façon, vous pouvez utiliser des nombres de la longueur de bits que vous voulez et même permettre à la longueur de bits de varier.

En fait, vous n'avez pas besoin d'implémenter une telle bibliothèque car GNU MP le gère déjà.

http://gmplib.org/

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