Bases de la programmation en C

uint8_t a = 0x0F;
if (~a == 0xF0)
    printf("equal\n");
else
    printf("not equal\n");

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 ?

  1. Aequal est affiché
  2. BUne erreur de compilation se produit, car ~ ne peut pas s'appliquer à une valeur uint8_t
  3. Cnot equal est affiché
Afficher la réponse et l'explication

Réponse : C. not equal est affiché

Avant le calcul de ~a, a est converti par promotion entière en l'int 0x0000000F. ~a ne vaut donc pas 0xF0 sur 8 bits, mais 0xFFFFFFF0 sur 32 bits (−16 en tant qu'int), qui n'est pas égal à 0xF0 (240). Pour comparer sur 8 bits, on revient d'abord à un type de 8 bits, comme dans (uint8_t)~a == 0xF0. C'est une erreur fréquente lorsqu'on inverse une valeur de registre pour la comparer.

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

Autres questions sur Bases de la programmation en C

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