Ich habe einen Code, der Vergleich von 64-Bit-Ganzzahlen verwendet. Es sieht ähnlich wie die folgende:-Wesign-Vergleich Warnung in g ++
#include <cstdio>
long long getResult()
{
return 123456LL;
}
int main()
{
long long result = getResult();
if (result > 0x000FFFFFFFFFFFFFLL
|| result < 0xFFF0000000000000LL)
{
printf("Something is wrong.\n");
if (result > 0x000FFFFFFFFFFFFFLL
|| result < -4503599627370496LL)
{
printf("Additional check failed too.\n");
}
else
{
printf("Additional check went fine.\n");
}
}
else
{
printf("Everything is fine.\n");
}
return 0;
}
Wenn dieser Code in g kompiliert wird ++ (versucht, verschiedene Versionen auf Ubuntu 12.04 x64: 4.6.3, 4.6.4, 4.7.3, 4.8.0) mit Fahnen -Wall -pedantic -std = C++ 0x test.cpp -o Test, den ich für die zweite Zeile der ersten if-Anweisung -Wsign-Vergleich, Warnmeldungen angezeigt (Ausgabe von g ++ - 4.8):
test.cpp:13:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
|| result < 0xFFF0000000000000LL)
^
Und wenn das Testprogramm läuft ich bekomme zwei Zeilen Text:
Something is wrong.
Additional check went fine.
Wenn für x86- oder x64-Architektur gleichen Code unter Windows mit MS Visual Studio 11 Express Update 2 mit Standardprojektoptionen Kompilieren ich nicht bekommen weder die Warnung noch diese Ausgabe, anstatt die Ausgabe:
Everything is fine.
Ist es ein Problem im Code? Wenn ja, könnten Sie es zeigen? Oder ist es ein Problem mit dem verwendeten Compiler?
Das Hinzufügen einer zusätzlichen Typumwandlung für die zweite Konstante in der ersten if-Anweisung entfernt die Warnung in g ++.
Das ist eine nette erste Frage, einschließlich eines vollständigen Beispiels und aller relevanten Informationen. –
'0xFFF0000000000000', als ein positiver Wert, passt nicht lange in lange. Es passt jedoch in eine unsigned long long, also ist das der Typ, den gcc benutzt. –
Das Suffix 'LL' kann verwendet werden, um den Compiler zu zwingen, einen längeren Typ zu wählen (' 1LL' ist lang lang), aber keinen kleineren Typ, für den Sie einen Cast wünschen ('(long long) 0xFFF0000000000000' (Genau genommen ist dies eine Implementierung definiert)). –