Bases de la programmation en C

Un programme qui exécute « char c = 200; » puis affiche c avec %d dans printf affiche −56 lorsqu'il est compilé et exécuté avec gcc pour Linux sur x86-64, et 200 avec gcc pour Linux sur Arm. Quelle est la raison de cette différence ?

  1. AArm est gros-boutiste (big-endian), si bien que les octets sont lus dans l'ordre inverse
  2. BLe fait qu'un char écrit sans signed ni unsigned soit signé ou non est choisi par l'implémentation : il est signé sur x86-64 et non signé sur Arm
  3. CSur x86-64, char fait 16 bits et son bit de poids fort est traité comme le signe
Afficher la réponse et l'explication

Réponse : B. Le fait qu'un char écrit sans signed ni unsigned soit signé ou non est choisi par l'implémentation : il est signé sur x86-64 et non signé sur Arm

La norme ne fixe pas si un char écrit sans signed ni unsigned est signé ou non signé : elle laisse ce choix à l'implémentation (comportement défini par l'implémentation). Sous Linux sur x86-64, char est signé et ne peut représenter que −128 à 127 : y placer 200 donne 200 − 256 = −56. Sous Linux sur Arm ou RISC-V, char est non signé et 200 est stocké tel quel. Pour manipuler des octets de données, on utilise unsigned char ou uint8_t afin de rendre le traitement du signe explicite.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. Quelle est la sortie obtenue en exécutant le code ci-dessus, où b++ est écrit à droite de && et de || ?
  2. Quelle est la sortie obtenue en exécutant l'instruction switch ci-dessus, qui contient un case sans break ?
  3. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?
  4. Lorsque la fonction f ci-dessus est appelée trois fois de suite, quelle est la valeur de retour du troisième appel ?
  5. En C, quelle association des durées de vie de (1) une variable locale déclarée sans static dans une fonction, (2) une zone allouée par malloc et (3) une variable déclarée hors de toute fonction est correcte ?