Warum warnt GCC nur für die Situationen 1 und 3 und nicht 2 im folgenden Code?GCC warnt nicht bei Verwendung von == op mit einer signierten Variablen und einem unsignierten Literal
Ich kompiliere mit -Wall und -g Flags.
int main() {
unsigned int ui = 4;
int si = 6;
if (si == ui) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
if (si == 2U) { // No Warning --- WHY ???
printf("xxxx");
}
if (si > 2U) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
return 0;
}
Es ist in der Tat ' promoted 'to unsigned, aber es gibt keinen Unterschied, wenn sein Wert kleiner als 2^31-1 ist. –
@ryanli: Wenn es immer zu unsigned hochgestuft wird, sollte si == 2U auch eine Warnung ausgeben. Warum ist 2147483647 der magische Punkt, wo gcc mit nur der -Wall-Flagge anfangen sollte, eine Warnung zu werfen. Ich glaube, ich verstehe deine anfängliche Antwort nicht. – nisah
weil '2U' ein Literal ist, und obwohl' si' signiert ist, weiß gcc zur Kompilierzeit klar, dass 'si' mit dem Wert von' 2U' verglichen werden kann, ohne Genauigkeit zu verlieren: wenn 'si' selbst negativ ist , es ist nicht gleich '2U' nach dem Aufstieg auf unsigned. Bei Literalwerten größer als 2^31-1 gibt gcc eine Warnung aus, da "si" gleich dem Literal sein kann, wenn "si" negativ ist, was möglicherweise nicht das Ergebnis ist, was Sie erwartet haben. Und "-Wall" warnt nicht, wie der Link in meiner Antwort zeigt. –