language agnostic - tag - Wann sind vorzeichenlose Werte vorzeichenlosen Werten zu verwenden?




meta tags seo (4)

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

Natürlich kompilieren Sie mit Warnungen, die ganz oben aufgetaucht sind, richtig?

Haben Sie darüber nachgedacht, Warnungen als Fehler zu behandeln, um noch einen Schritt weiter zu gehen?

Der Nachteil bei der Verwendung von vorzeichenbehafteten Zahlen ist die Versuchung, sie zu überladen, so dass 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 zu Geben Sie an, ob etwas ausgewählt ist, und speichern Sie die Auswahl. Bevor Sie es wissen, testen Sie überall auf ein negatives und der Compiler beschwert sich darüber, wie Sie die Menüauswahl mit der Anzahl der verfügbaren Menüauswahlen vergleichen möchten - aber das ist gefährlich, da es sich um unterschiedliche Typen handelt . Also mach das nicht.

Wann ist es angebracht, eine Variable ohne Vorzeichen über eine mit Vorzeichen zu setzen? Was ist mit einer for Schleife?

Ich höre viele Meinungen dazu 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.


Ich würde denken, dass, wenn Ihr Geschäftsfall vorschreibt, dass eine negative Zahl ungültig ist, Sie einen Fehler zeigen oder werfen lassen möchten .

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 wurden, vorzeichenlose Ganzzahlen entdeckt. Ich habe die Binärdaten absichtlich "verfälscht" und statt eines erwarteten Fehlers negative Werte erhalten. Ich stellte fest, dass der Wert für meinen Geschäftsfall nicht gültig war, obwohl er konvertiert wurde.
Mein Programm hat keinen Fehler gemacht und ich habe falsche Daten in die Datenbank bekommen. Es wäre besser gewesen, wenn ich uint verwendet uint und das Programm fehlgeschlagen wäre.


In Ihrem obigen Beispiel wäre es nützlich, wenn "i" immer positiv ist und ein höherer Bereich von Vorteil ist, wenn kein Vorzeichen vorliegt. Zum Beispiel, wenn Sie "declare" -Anweisungen verwenden, wie zum Beispiel:

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

Vor allem, wenn sich diese Werte niemals ändern.

Wenn Sie jedoch ein Buchhaltungsprogramm durchführen, bei dem die Leute nicht für ihr Geld verantwortlich sind und ständig rote Zahlen schreiben, möchten Sie auf jeden Fall "signiert" verwenden.

Ich stimme dem Heiligen allerdings zu, dass es eine gute Faustregel ist, signiert zu verwenden, die C standardmäßig verwendet, damit Sie abgesichert sind.


size_t ist häufig eine gute Wahl, oder size_type wenn Sie eine STL-Klasse verwenden.







types