Comparaison des valeurs signées et non signées dans MSVC : comprendre l'absence d'avertissements
Dans cet extrait de code, vous remarquez l'absence d'avertissements pour une comparaison spécifique :
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; ... if (a == b) // no warning
Cela soulève la question de savoir pourquoi la comparaison entre signé et non signé les valeurs ne déclenchent pas d'avertissement lors d'une comparaison à l'aide de ==, alors que c'est le cas pour les autres comparaisons (<, >, <=, >=).
Promotion d'arrière-plan et C4018
Vous vous attendiez à ce que cette comparaison produise un avertissement en raison d'une promotion en arrière-plan. Cependant, les deux derniers exemples réfutent cette logique :
if (((unsigned int)a) == b) // no warning if (a == ((int)b)) // no warning
Règles de conversion
Lors de la comparaison de valeurs signées et non signées, le compilateur suit des règles de conversion spécifiques décrites dans le C standard. Pour la comparaison d'égalité (==), peu importe si les opérandes sont signés ou non signés car le résultat est toujours un booléen (vrai ou faux).
Cependant, pour d'autres comparaisons, la valeur signée est convertie à non signé. Cette conversion est importante car elle affecte les résultats de la comparaison. Par exemple, dans l'instruction suivante :
-1 > 2U
Le résultat est vrai car -1 est converti en un grand entier positif non signé, ce qui entraîne une comparaison correcte.
Avertissement MSVC Levels
Le choix de MSVC de supprimer les avertissements pour les comparaisons d'égalité signé/non signé est intentionnel. Selon les développeurs, comparer les valeurs signées et non signées à l'aide de == aboutit souvent à un résultat intuitif. Par exemple, -1 == -1 est vrai, qu'ils soient signés ou non.
D'autre part, les comparaisons impliquant plus de (>) ou moins de (<) sur signé/non signé les combinaisons sont plus susceptibles de conduire à des résultats inattendus. Par conséquent, MSVC émet des avertissements pour ces comparaisons à un stade antérieur de l'optimisation afin d'aider les développeurs à détecter les problèmes potentiels.
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!