language agnostic - Wann sollten vorzeichenlose Werte gegenüber vorzeichenbehafteten verwendet werden?

Translate

Wann ist es angebracht, eine vorzeichenlose Variable gegenüber einer vorzeichenbehafteten zu verwenden? Was ist mit in einemforSchleife?

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 gewesen seinSun MicrosystemsTeil.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich war froh zu findenein gutes Gesprächzu diesem Thema, 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 das Vermischen der beiden Typen zu vermeiden (wie der Artikel warnt).

Quelle
Translate

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.:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

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
Translate

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
Translate

Ich würde denken, wenn Ihr Geschäftsfall vorschreibt, dass eine negative Zahl ungültig ist, würden Sie dies tunwolleneinen Fehler anzeigen oder auslösen lassen.

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 verwendet hätteuintund hatte das Programm fehlgeschlagen.

Quelle
Translate

size_tist oft eine gute Wahl dafür, odersize_typeWenn Sie eine STL-Klasse verwenden.

Quelle