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 ?
- AArm est gros-boutiste (big-endian), si bien que les octets sont lus dans l'ordre inverse
- 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
- 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.
Continuer : 9 autres questions sur Bases de la programmation en C