Bases de la programmation en C

unsigned char a = 200, b = 100;
int s = a + b;
unsigned char c = a + b;
printf("%d %d\n", s, c);

unsigned char fait 8 bits et int fait 32 bits. Quelle est la sortie obtenue en exécutant le code ci-dessus ?

  1. A44 44
  2. B300 44
  3. C300 300
Afficher la réponse et l'explication

Réponse : B. 300 44

En C, les valeurs des types plus petits qu'int (comme char et short) sont converties en int avant tout calcul (promotion entière). a + b n'est donc pas calculé sur 8 bits mais en int, ce qui donne 300, et s, de type int, reçoit 300 tel quel. Lors de l'affectation à c, qui fait 8 bits, la valeur est convertie en 44, le reste de la division de 300 par 256. Même sur un microcontrôleur 8 bits, la norme veut que les calculs intermédiaires d'une expression se fassent sur la largeur d'un int.

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

Autres questions sur Bases de la programmation en C

  1. uint8_t est un type entier non signé de 8 bits et int fait 32 bits. Quel est le résultat de l'exécution du code ci-dessus ?
  2. int et unsigned int font 32 bits. Quel est le résultat de l'exécution du code ci-dessus ?
  3. unsigned int fait 32 bits. Quel est le comportement du code ci-dessus à l'exécution ?
  4. 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 ?
  5. Quelle est la sortie obtenue en exécutant le code ci-dessus, où b++ est écrit à droite de && et de || ?