Exécution d'un programme sur un autre processeur que celui qui l'a compilé

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Admettons que je conduise un projet en C. Mettons que dans mon code source, j’écrive ceci :

int a = UNE_TRES_GRANDE_VALEUR; //valeur proche de la limite max du type int sur ma machine

Je compile mon code, il fonctionne bien sur ma machine. Je veux faire tourner ce code sur un autre processeur, mais sur cet autre processeur, les int ne font pas 4 octets mais 2 (cela peut arriver). Mon code va-t-il fonctionner ? Ce que je crains, c’est que la valeur contenue dans le int sur ma machine ne puisse pas être contenue sur un int d’un autre processeur et que tout soit buggé. Suis-je contraint d’utiliser un autre type que int pour être certain de ne pas avoir de problème dans ce genre ? Y a-t-il des ressources que vous me conseilleriez pour en apprendre sur ces notions de "portabilité" (je ne suis pas certain d’employer le bon mot…) ? Merci pour votre aide

Tout d’abord, si tu compiles ton code pour un type de processeur, il y a de bonnes chances qu’il ne puisse pas s’exécuter sur un processeur différent car le jeu d’instructions n’est pas le même. Les processeurs x86 64 bits d’Intel sont toutefois compatibles avec le jeu d’instructions 32 bits (hors instructions système).

Cela mis à part, si tu veux un code portable à travers différentes architectures, il faut en effet prendre certaines précautions. Je pense que la ligne de code que tu cites déclencherait un warning dans tous les bons compilateurs, à condition que le warning soit activé — ce qui est rarement le cas par défaut.

Si la taille des entiers est importante, un code portable évitera d’utiliser int et utilisera plutôt les types int32_t, uint64_t, etc. de <stdint.h>.

Salut,

Pour compléter la réponse d'@otini, il y a deux aspects différents à traiter :

  1. La constante entière ;
  2. Sa conversion vers le type de la variable.

Par défaut, en C, une constante entière sera de type int, long int ou long long int (ou non signée si octale ou hexadécimal) en fonction de la valeur à représenter. Toutefois, si aucun de ces types ne peut représenter la valeur fournie, la constante sera non typée1.

Dans un second temps, tu assignes cette constante à une variable, il y a donc une conversion implicite vers le type de la variable. Dans un tel cas, les règles décrites dans le chapitre sur les limites des types s’appliquent.

Si tu veux éviter ce genre de problème, tu dois partir des intervalles de valeur garanti par la norme pour chaque type. Ils sont décrits dans le chapitre sur les limites des types également.

Edit : à noter que si la constante ne peut-être représentée par aucun type, il s’agit d’une erreur (GCC ne la traite pas comme telle, mais Clang, oui).

Each constant shall have a type and the value of a constant shall be in the range of representable values for its type.

ISO/IEC 9899:201x, doc. N1570, § 6.4.4.1 Integer constants, al. 2, p. 63

  1. ISO/IEC 9899:201x, doc. N1570, § 6.4.4.1 Integer constants, al. 6, p. 64
+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte