Wann sollten vorzeichenlose Werte anstelle von vorzeichenbehafteten Werten verwendet werden?

StackOverflow https://stackoverflow.com/questions/336

  •  08-06-2019
  •  | 
  •  

Frage

Wann ist es angebracht, eine vorzeichenlose Variable einer vorzeichenbehafteten Variablen vorzuziehen?Wie wäre es mit einem for Schleife?

Ich höre viele Meinungen dazu und wollte sehen, ob es so etwas wie einen Konsens gibt.

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 sein Sun Microsystems' Teil.

War es hilfreich?

Lösung

Ich war froh, es zu finden ein gutes Gespräch zu diesem Thema, da ich vorher nicht wirklich darüber nachgedacht hatte.

Zusammenfassend lässt sich sagen, dass vorzeichenbehaftet eine gute allgemeine Wahl ist – auch wenn Sie absolut sicher sind, dass alle Zahlen positiv sind –, wenn Sie mit der Variablen rechnen möchten (wie in einem typischen Fall einer for-Schleife).

Wenn Sie bitweise Dinge wie Masken tun, macht unsigned mehr Sinn.Oder wenn Sie unbedingt diesen zusätzlichen positiven Bereich erreichen möchten, indem Sie das Vorzeichenbit nutzen.

Persönlich bevorzuge ich Signed, weil ich mir selbst nicht zutraue, konsistent zu bleiben und eine Vermischung der beiden Typen zu vermeiden (wovor der Artikel warnt).

Andere Tipps

Wenn in Ihrem obigen Beispiel „i“ immer positiv ist und ein höherer Bereich von Vorteil wäre, wäre „unsigned“ nützlich.Wenn Sie beispielsweise „declare“-Anweisungen verwenden, wie zum Beispiel:

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

Vor allem, wenn sich diese Werte nie ändern werden.

Wenn Sie jedoch ein Buchhaltungsprogramm verwenden, bei dem die Leute verantwortungslos mit ihrem Geld umgehen und ständig rote Zahlen schreiben, sollten Sie auf jeden Fall „signiert“ verwenden.

Ich stimme jedoch mit Saint überein, dass eine gute Faustregel darin besteht, signiert zu verwenden, was C tatsächlich standardmäßig verwendet, sodass Sie abgesichert sind.

C- und C++-Compiler generieren eine Warnung, wenn Sie vorzeichenbehaftete und vorzeichenlose Typen vergleichen.In Ihrem Beispielcode konnten Sie Ihre Schleifenvariable nicht vorzeichenlos machen und den Compiler Code ohne Warnungen generieren lassen (vorausgesetzt, diese Warnungen waren aktiviert).

Natürlich kompilieren Sie mit ganz aufgedrehten Warnungen, oder?

Und haben Sie darüber nachgedacht, beim Kompilieren mit „Warnungen als Fehler behandeln“ 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 zu erstellen, die zwei Variablen hat, eine bis Geben Sie an, ob etwas ausgewählt ist, und speichern Sie mit einem anderen, um welche Auswahl es sich handelt.Bevor Sie es merken, testen Sie überall auf negative Eins und der Compiler beschwert sich darüber, dass Sie die Menüauswahl mit der Anzahl Ihrer Menüauswahlen vergleichen möchten – aber das ist gefährlich, weil es sich um unterschiedliche Typen handelt .Also tu das nicht.

Ich würde denken, dass Sie dies tun würden, wenn Ihr Geschäftsfall vorschreibt, dass eine negative Zahl ungültig ist wollen um einen Fehler anzuzeigen oder auszulösen.

Vor diesem Hintergrund habe ich erst kürzlich etwas über vorzeichenlose Ganzzahlen erfahren, als ich an einem Projekt arbeitete, bei dem Daten in einer Binärdatei verarbeitet und in einer Datenbank gespeichert wurden.Ich habe die Binärdaten absichtlich „verfälscht“ und am Ende negative Werte anstelle eines erwarteten Fehlers erhalten.Ich stellte fest, dass der Wert trotz der Umrechnung nicht für meinen Geschäftsfall gültig war.
Mein Programm hat keinen Fehler gemacht und ich habe letztendlich falsche Daten in die Datenbank eingegeben.Es wäre besser gewesen, wenn ich es verwendet hätte uint und das Programm scheiterte.

size_t ist dafür oft eine gute Wahl, oder size_type wenn Sie eine STL-Klasse verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top