Question sur le comportement en C pour le dépassement inférieur entier non signé

J’ai lu à de nombreux endroits que le dépassement d’entier est bien défini en C, contrairement à la contrepartie signée.

Le débordement est-il le même?

Par exemple:

unsigned int x = -1; // Does x == UINT_MAX? 

Merci.

Je ne me souviens plus où, mais j’ai lu quelque part que l’arithmétique sur les types intégraux non signés est modulaire, donc si c’était le cas, alors -1 == UINT_MAX mod (UINT_MAX + 1).

§6.2.5, paragraphe 9:

Un calcul impliquant des opérandes non signés ne peut jamais déborder, car un résultat qui ne peut pas être représenté par le type entier non signé résultant est réduit modulo le nombre qui est supérieur à la plus grande valeur pouvant être représentée par le type résultant.

Modifier:

Désolé, mauvaise référence, mais le résultat est toujours bloqué. La référence correcte est § 6.3.1.3 (conversion d’entier signé et non signé):

si le nouveau type n’est pas signé, la valeur est convertie en ajoutant ou en soustrayant de manière répétée une valeur de plus que la valeur maximale pouvant être représentée dans le nouveau type jusqu’à ce que la valeur se situe dans la plage du nouveau type.

Alors oui, x == UINT_MAX .

-1, lorsqu’il est exprimé en tant que nombre complémentaire de 2, équivaut à 0xFF … F pour combien de bits votre nombre est. Dans un espace non signé, cette valeur est la valeur maximale possible (tous les bits sont définis). Donc oui, x == UINT_MAX. Le code suivant émet “1” sur un compilateur ssortingct C99:

 #include  #include  #include  int main(int argc, char **argv){ uint32_t x = -1; printf("%d", x == UINT_MAX ? 1 : 0); return 0; } 

Vous mélangez des nombres signés et non signés, ce qui n’est pas cool.

 unsigned int x = 0u - 1u; // is OK though