Wann ist es angebracht, eine vorzeichenlose Variable gegenüber einer vorzeichenbehafteten zu verwenden? Was ist mit einer for
Schleife?
Ich höre viele Meinungen darüber und wollte sehen, ob es etwas gibt, das einem Konsens ähnelt.
for (unsigned int i = 0; i < someThing.length(); i++) {
SomeThing var = someThing.at(i);
// You get the idea.
}
Ich weiß, dass Java keine vorzeichenlosen Werte hat, und das muss eine bewusste Entscheidung von Sun Microsystems gewesen sein.
language-agnostic
types
Bernard
quelle
quelle
Antworten:
Ich war froh, ein gutes Gespräch zu diesem Thema zu finden, da ich vorher nicht wirklich darüber nachgedacht hatte.
Zusammenfassend ist signiert eine gute allgemeine Wahl - selbst wenn Sie absolut sicher sind, dass alle Zahlen positiv sind -, wenn Sie die Variable arithmetisch ausführen möchten (wie in einem für Schleifen typischen Fall).
Wenn Sie bitweise Dinge wie Masken tun, macht unsigniert mehr Sinn. Oder wenn Sie unbedingt diesen zusätzlichen positiven Bereich erreichen möchten, indem Sie das Vorzeichenbit nutzen.
Persönlich mag ich es, unterschrieben zu sein, weil ich mir nicht traue, konsistent zu bleiben und es zu vermeiden, die beiden Typen zu vermischen (wie der Artikel warnt).
quelle
unsigned
es für die Erkennung von Überläufen in nicht vertrauenswürdigen Eingaben weit überlegen ist. Leider sind die vorgeschlagenen "Antworten" auf das Rätsel nicht so toll. Meins ist,template<size_t limit> bool range_check_sum( unsigned a, unsigned b ) { return (a < limit) && (b < limit - a); }
wenn jemand eine ähnlich einfache und unkomplizierte Antwort mit signierten Typen hat, würde ich sie gerne sehen.In Ihrem obigen Beispiel wäre unsigned nützlich, wenn 'i' immer positiv ist und ein höherer Bereich von Vorteil wäre. Zum Beispiel, wenn Sie Anweisungen zum Deklarieren verwenden, z. B.:
Besonders wenn sich diese Werte nie ändern werden.
Wenn Sie jedoch ein Buchhaltungsprogramm durchführen, bei dem die Leute mit ihrem Geld unverantwortlich sind und ständig rote Zahlen schreiben, sollten Sie auf jeden Fall "signiert" verwenden.
Ich stimme dem Heiligen jedoch zu, dass eine gute Faustregel darin besteht, signiert zu verwenden, was C standardmäßig verwendet, damit Sie abgesichert sind.
quelle
Ich würde denken, wenn Ihr Geschäftsfall vorschreibt, dass eine negative Zahl ungültig ist, möchten Sie , dass ein Fehler angezeigt oder ausgelöst wird.
Vor diesem Hintergrund habe ich erst kürzlich bei der Arbeit an einem Projekt, bei dem Daten in einer Binärdatei verarbeitet und in einer Datenbank gespeichert werden, von vorzeichenlosen Ganzzahlen erfahren. Ich habe die Binärdaten absichtlich "verfälscht" und am Ende negative Werte anstelle eines erwarteten Fehlers erhalten. Ich stellte fest, dass der Wert, obwohl er konvertiert wurde, für meinen Business Case nicht gültig war.
Mein Programm ist nicht fehlerhaft und ich habe falsche Daten in die Datenbank aufgenommen. Es wäre besser gewesen, wenn ich
uint
das Programm verwendet hätte und fehlgeschlagen wäre.quelle
C- und C ++ - Compiler generieren eine Warnung, wenn Sie signierte und nicht signierte Typen vergleichen. In Ihrem Beispielcode konnten Sie Ihre Schleifenvariable nicht ohne Vorzeichen setzen und den Compiler ohne Warnungen Code generieren lassen (vorausgesetzt, diese Warnungen waren aktiviert).
Natürlich kompilieren Sie mit Warnungen, die ganz aufgedreht sind, oder?
Und haben Sie darüber nachgedacht, mit "Warnungen als Fehler behandeln" zu kompilieren, um noch einen Schritt weiter zu gehen?
Der Nachteil bei der Verwendung von vorzeichenbehafteten Zahlen besteht darin, dass die Versuchung besteht, sie zu überladen, sodass beispielsweise die Werte 0-> n die Menüauswahl sind und -1 bedeutet, dass nichts ausgewählt ist, anstatt eine Klasse mit zwei Variablen zu erstellen, eine bis Geben Sie an, ob etwas ausgewählt ist, und ein anderes, um diese Auswahl zu speichern. Bevor Sie es wissen, testen Sie überall auf negative und der Compiler beschwert sich darüber, wie Sie die Menüauswahl mit der Anzahl Ihrer Menüoptionen vergleichen möchten - aber das ist gefährlich, weil es sich um verschiedene Typen handelt . Also tu das nicht.
quelle
size_t
ist oft eine gute Wahl dafür odersize_type
wenn Sie eine STL-Klasse verwenden.quelle
size_type
Mitglied für die Anzahl der Elemente verfügbar , nicht nur für Bytes. Es sollte anstelle vonstd::size_t
verfügbar verwendet werden, aber es ist ungenau zu implizieren, dass alles, was mit beginnt,size_t
nur Bytes bedeuten kann.