"Vergleich von signed- und unsigned-Werten" - Warum überhaupt signed?
-
Warum wird bei allen Klassen der VCL für Count/Length ein int Datentyp genutzt und nicht unsigned int / DWORD? Es können doch eh nie weniger als 0 Elemente vorhanden sein?
ich schreibe für gewöhnlich (Beispiel):
typedef unsigned int UINT; //... TBytes ByteArr; ByteArr.set_length(10); for (UINT i = 0; i < ByteArr; ++i) { }
Erhaltene Warnung: "Vergleich von signed- und unsigned-Werten".
Ich habe mir ja zum Ziel gesetzt alle Warnungen weg zu bekommen, und dies ist meine öfteste Warnung.
int will ich wirklich nicht benutzen und casten ist doch bestimmt performance mindernd (?).Advise?
-
Tim06TR schrieb:
Warum wird bei allen Klassen der VCL für Count/Length ein int Datentyp genutzt und nicht unsigned int / DWORD?
Weil unsigned-Datentypen in Delphi eher unüblich sind. Sie haben Vorteile (wie du sagst: Werte < 0 machen eh keinen Sinn) und Nachteile (es ist viel einfacher, mit unvorsichtigen Vergleichen Blödsinn zu bauen; versuche mal, mit unsigned-Typen eine for-Schleife zu schreiben, die auf 0 herunterzählt).
Tim06TR schrieb:
int will ich wirklich nicht benutzen
Warum nicht? Man tut gut daran, sich an bestehende Gebräuchlichkeiten anzupassen. Wenn du mit Delphi-Typen arbeitest, nimm int, wenn du mit STL-Containern zu tun hast, nimm unsigned (bzw. std::size_t oder Iteratoren, wenn du's ganz genau haben willst).
Tim06TR schrieb:
und casten ist doch bestimmt performance mindernd (?).
In diesem Fall nicht. Nur häßlich, das ist es.
-
Eine Sache noch: Warum überhaupt die Warnung?
-
Tim06TR schrieb:
Eine Sache noch: Warum überhaupt die Warnung?
Weil bei einem Vergleich zwischen unsigned int und int erstmal beide Operanden nach unsigned int konvertiert werden, wodurch das Vergleichsergebnis eventuell unerwartet sein könnte:
int a = -5; unsigned int b = 5; if (a < b) // kommt nie hierher
-
Wie dumm von mir.
Komisch eigentlich, dass ich da noch nie in diese Falle reingetappt bin.
-
Darüber ärgere ich mich auch öfter, mir verschließt sich vollkommen der Sinn, warum eine Liste -3 Elemente haben könnte. Auch wenn es in Delphi "unüblich" ist, unsigned Datentypen zu benutzen ist es meiner Meinung nach trotzdem richtig und in Delphi unzweckmäßig umgesetzt.
-
DocShoe schrieb:
Darüber ärgere ich mich auch öfter, mir verschließt sich vollkommen der Sinn, warum eine Liste -3 Elemente haben könnte. Auch wenn es in Delphi "unüblich" ist, unsigned Datentypen zu benutzen ist es meiner Meinung nach trotzdem richtig und in Delphi unzweckmäßig umgesetzt.
Das wird durchaus kontrovers diskutiert, auch im Delphi-Team. Hier ist so ein Verfechter deiner Meinung:
http://alex.ciobanu.org/?p=175Außerdem gibt es hier noch einen Haufen interessanter Kommentare zum Thema:
http://stackoverflow.com/questions/797484/should-i-use-unsigned-integers-for-count-members/799817#799817
Speziell die Argumente von Barry Kelly und Eric Grange finde ich beachtenswert.