Considérez l'extrait de code suivant :
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; if (a < b) // warning C4018: '<' : signed/unsigned mismatch c = true; ... // Additional comparisons if (a == b) // no warning c = true; ... // Additional comparisons
Comprendre l'incompatibilité signé/non signé
En C , signé et non signé les entiers ont des types distincts, et lors de leur comparaison directe (par exemple, en utilisant <, >), MSVC émet un avertissement (C4018). En effet, le compilateur tente de promouvoir les deux opérandes vers un type commun avant d'effectuer la comparaison.
Les règles de promotion
Pour les comparaisons d'entiers, MSVC suit « l'arithmétique habituelle conversions" telles que définies dans la norme C. Ces règles déterminent quelles promotions ont lieu avant la comparaison :
Pourquoi aucun avertissement pour a == b ?
Dans l'exemple, lors de la comparaison de a et b en utilisant ==, MSVC n'émet pas d'avertissement car les deux opérandes sont convertis en entier non signé avant la comparaison. Puisque les valeurs de a et b sont toutes deux positives, il n'y a pas d'inadéquation signé/non signé et le résultat est correct.
Résultats intuitifs et non intuitifs
Alors l'absence d'avertissement pour a == b peut sembler intuitive, on ne peut pas en dire autant des comparaisons comme a < b. Dans ce cas, la conversion de a en non signé entraîne une valeur plus grande, ce qui affecte le résultat de la comparaison. Ainsi, MSVC émet un avertissement pour mettre en évidence les problèmes potentiels liés aux comparaisons signées/non signées.
Conclusion
MSVC n'émet pas d'avertissement pour a == b car l'arithmétique habituelle les conversions entraînent la conversion des deux opérandes dans le même type non signé, éliminant ainsi toute incompatibilité signé/non signé. Cependant, pour les comparaisons utilisant des opérateurs tels que < ou >, le risque de résultats inattendus dus aux conversions justifie un avertissement de la part du compilateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!