Bases de la programmation en C

int et unsigned int font 32 bits. Laquelle des opérations suivantes est un comportement indéfini selon la norme du langage C ?

  1. AAjouter 1 à une variable unsigned int dont la valeur est le maximum, 4294967295
  2. BDécaler vers la droite de 1 bit, avec >>, une valeur int négative
  3. CAjouter 1 à une variable int dont la valeur est le maximum, 2147483647
Afficher la réponse et l'explication

Réponse : C. Ajouter 1 à une variable int dont la valeur est le maximum, 2147483647

Une opération sur des entiers signés dont le résultat sort de la plage représentable, comme 2147483647 + 1 en int, est un comportement indéfini. L'arithmétique des entiers non signés est définie comme revenant au reste de la division par 2³² : 4294967295 + 1 donne 0, et ce n'est pas un comportement indéfini. Le décalage à droite d'une valeur négative est un comportement défini par l'implémentation, qui choisit entre décalage arithmétique et décalage logique ; gcc effectue un décalage arithmétique. En revanche, le décalage à gauche d'une valeur négative est un comportement indéfini.

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

Autres questions sur Bases de la programmation en C

  1. Lorsque la fonction ci-dessus est compilée avec gcc en activant l'optimisation, le test if (p == NULL) peut être supprimé. Quelle en est la raison ?
  2. Que fixe la norme du langage C au sujet de la taille du type int ?
  3. Dans les programmes embarqués, une variable qui reçoit la valeur d'un registre de périphérique de 32 bits est souvent déclarée avec le type uint32_t de stdint.h plutôt qu'avec unsigned int. Quelle en est la raison principale ?
  4. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui contient une division entre entiers ?
  5. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui utilise ++ en préfixe et en suffixe ?