Warning: '<': signed/unsigned mismatch ignorieren?
-
N Abend!
Mir ist in letzter Zeit ständig die Warnung
Warning 1 warning C4018: '<' : signed/unsigned mismatch
angezeigt worden.
Kann man diese ignorieren?
Ausserdem verstehe ich nicht, warum man signed und unsigned nicht vergleichen kann. Oder verstehe ich die Warnung falsch?
Wäre froh, wenn mich da jemand aufklären könnte
-
Ich vermute, dass die zum Vergleich intern in den gleichen Typ gebracht werden müssten. Da signed negative Zahlen hat, würde das aber zu sehr hohen positiven Zahlen führen, sodass -5 < 4 nicht mehr true ergäbe.
Lösung ist einfach unsigned Typen zu verwenden, wenn man mit unsigned Typen vergleichen will. Für Zählschleifen nehme ich oft std::size_t.
-
Eisflamme schrieb:
Ich vermute, dass die zum Vergleich intern in den gleichen Typ gebracht werden müssten. Da signed negative Zahlen hat, würde das aber zu sehr hohen positiven Zahlen führen, sodass -5 < 4 nicht mehr true ergäbe.
Habs gerade mal getestet und
unsigned int i = 3; int j = -4; if ( j < i ) cout << "true" << endl; else cout << "false" << endl;
gibt 'false' aus. Wenn ich das unsigned wegnehme, dann gibts 'true' aus.
Dann muss ich als Index wohl ab jetzt unsigned int i nehmen, wenn ich i < std::vector<>::size() vergleiche.
Danke dir
-
Ja.
oder gleich size_t.
-
Eisflamme schrieb:
Da signed negative Zahlen hat, würde das aber zu sehr hohen positiven Zahlen führen
Das habe ich nicht ganz verstanden...
Die Meldung warnt dich, dass du zwei verschiedene Datentypen verwendest, die logischerweise unterschiedliche Wertebereiche besitzen. Da es manchmal unbeabsichtigt passiert, führt es automatisch zu ungewollten Ergebnissen. Wenn du dir sicher bist, dass das so sein soll, kannst du dir Meldung auch ignorieren/verstecken. Eleganter wäre es aber, die Ursache zu beseitigen.Grüße,
Rewind
-
Ich versteh nicht, was Du nicht verstehst, weil Deine Erklärung richtig ist. Dein Zitat von mir bezieht sich auf den Fall der negativen Werte für signed Typen.
-
[Rewind] schrieb:
Eisflamme schrieb:
Da signed negative Zahlen hat, würde das aber zu sehr hohen positiven Zahlen führen
Das habe ich nicht ganz verstanden...
http://de.wikipedia.org/wiki/Zweierkomplement schrieb:
Negative Zahlen werden wie folgt aus einer positiven Zahl kodiert: Sämtliche binären Stellen werden negiert und zu dem Ergebnis der Wert 1 addiert. (Mathematisch exaktes Verfahren siehe formale Umwandlung.)
-1 hat zB alle bits gesetzt. Aber ein unsigned mit allen bits gesetzt ist die groesste darstellbare Zahl fuer diesen Typen.
Deshalb ist ein signed/unsigned Vergleich gefaehrlich. Da negative Zahlen zu problemen fuehren.
-
volkard schrieb:
Ja.
oder gleich size_t.Bringt der gewisse Vorteile?
-
@Eisflamme: sorry, hatte deinen Satz falsch gelesen.
-
Ja, er ist der selbe Typ, den dir auch string::size() zurückgibt. (und niemand garantiert dir, daß beim nächste Compiler nicht sizeof(int)<sizeof(size_t) ist)
-
CStoll schrieb:
Ja, er ist der selbe Typ, den dir auch string::size() zurückgibt. (und niemand garantiert dir, daß beim nächste Compiler nicht sizeof(int)<sizeof(size_t) ist)
Achso. Ja das macht Sinn
Ich habe gerade gesehen, dass std::vector size_type braucht. Sind size_t und size_type genau das selbe?
Wenn nicht wäre es dann ja am besten size_type zu verwenden mit std::vector<>::size, nicht?
-
CStoll schrieb:
Ja, er ist der selbe Typ, den dir auch string::size() zurückgibt. (und niemand garantiert dir, daß beim nächste Compiler nicht sizeof(int)<sizeof(size_t) ist)
Ist bei mir jetzt schon.
#include <iostream> using namespace std; int main() { cout<<sizeof(int)<<'\n'; cout<<sizeof(size_t)<<'\n'; }
Ausgabe:
4 8
(Linux 64Bit)
-
icarus2 schrieb:
Sind size_t und size_type genau das selbe?
Sie können gleich sein (und sind es auch meistens), müssen aber nicht. Daraus folgt die gleiche Argumentation wie oben bei size_t und string. Nimm daher um 100% korrekt zu sein das was tatsächlich angeboten wird. Wobei ich selber diesen Schritt nicht gehe und ganz faul das kürzere size_t schreibe anstatt container_type::size_type (nach vorherigem typedef für den betreffenden Container). Man kann es eben manchmal auch übertreiben mit der Portabilität.
-
Oki, dann nehme ich auch size_t.
Thx!