Taille de l’int en C sur différentes architectures

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 en C ++) de définir un type entier avec une taille spécifique qui assure qu’il sera identique dans différentes architectures? Comme:

 typedef int8  typedef int16  

Ou tout autre moyen permettant à d’autres parties du programme d’être compilées sur une architecture différente.

Ce que vous voulez, c’est , 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 pour Windows, voir msinttypes .

Cela vous permettra d’utiliser int32_t et uint32_t , ainsi que 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 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 requirejs. Si une implémentation fournit l’en-tête, c’est en pratique qu’ils définissent tous les types.

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 les parameters définis avec, par exemple, cc -D_INT16_IS_INT et #ifdef ) le type correct à utiliser pour une taille de bit spécifique. Vous pouvez définir les définitions requirejses pour chaque plate-forme que vous souhaitez prendre en charge avec du code C en utilisant CHAR_BIT et sizeof() .

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


7.18.1.1 Types entiers de largeur exacte

  1. Le nom typedef intN_t désigne un type entier signé avec une largeur N , aucun bit de remplissage et une représentation complémentaire à 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é d’une largeur de 24 bits exactement.

  3. Ces types sont optionnels. 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 le choix des types, quelque chose comme ceci 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 #ifdef chaque plate-forme avec #ifdef ou autre, je doute que ce soit facilement possible. Mais de nombreuses bibliothèques font déjà cette tâche pour vous. Pour MSVC c’est __int8 , __int16 , etc. La bibliothèque GTK a des typedefs similaires.

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;

Cordialement,

Sebastiaan

Vous voudrez peut-être jeter un oeil à pstdint.h . Il s’agit d’une implémentation portable de stdint.h et ne nécessite pas de support du compilateur C99.

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 en bits de votre choix et même en autoriser la variation.

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

http://gmplib.org/