Frage

Was ist der Grund für die Verwendung signierter Zahlen als Indizes in .net?

In Python können Sie Index aus dem Ende eines Arrays durch negative Zahlen zu senden, aber dies ist nicht der Fall in .Net. Es ist nicht leicht für .Net später ein solches Feature hinzuzufügen, wie es vielleicht ein anderer Code brechen könnte mit speziellen Regeln (ja, eine schlechte Idee, aber ich denke, es passiert) auf Indizierung.

Nicht, dass ich jemals Index-Arrays über 2,147,483,647 in Größe benötigt haben, aber ich kann wirklich nicht verstehen, warum sie unterzeichnet Zahlen wählen.

Kann es sein, weil es normal ist, unterzeichnet Zahlen in Code zu benutzen?

Edit: Ich habe gerade diese Links:

Die Gefahren des unsigned Iteration in C / C ++

Signed Wortlängen und Indizes

Edit2: Ok, ein paar andere gute Gründe, aus dem Thread Matthew Flaschen geschrieben:

  • Historische Gründe, es ist ein C-ähnliche Sprache
  • Interop mit c
War es hilfreich?

Lösung

Der Einfachheit halber natürlich. Mögen Sie Probleme Größe Arithmetik mit unsigned ints tun?

Andere Tipps

Es kann auf die langen Tradition sein, einen Wert unter 0 als einen ungültigen Index. Methoden wie String.IndexOf -1 zurück, wenn das Element nicht gefunden wird. Daher muss der Rückgabewert zu unterzeichnen. Wenn die Index-Verbraucher unsigned Werte erfordern würden, würden Sie eine) Kontrolle haben und b) warfen den Wert, den es zu nutzen. Mit signierten Indizes, müssen Sie nur den Scheck.

Unsigned ist nicht CLS-kompatibel.

Die primäre Nützlichkeit von Zahlen ohne Vorzeichen ergibt sich, wenn eine größere Anzahl von kleineren Komponieren und vice versa. Zum Beispiel, wenn man vier unsigned Bytes aus einer Verbindung empfängt und wünscht ihren Wert zu betrachten, als Ganzes betrachtet, als 32-Bit-Integer, ohne Vorzeichen Typen Mitteln kann man einfach sagen:

  value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216);

Im Gegensatz dazu, wenn der Bytes unterzeichnet wurde, ein Ausdruck, wie das oben mehr kompliziert werden würde.

Ich bin nicht sicher, sehe keinen Grund für eine Sprache, die ich entworfen wirklich heute nicht unsigned Versionen aller Art kürzer als der längste signierten Integer-Typ zu enthalten, mit der Semantik, dass alle integer (diskrete Menge numerische Zeichen bedeutet, anstatt eine bestimmte Art) Operationen, die vollständig innerhalb des größten unterzeichnet Typ standardmäßig passen wird durchgeführt werden, als ob sie auf diese Art betrieben wurden. Einschließlich einer nicht signierte Version der größten unterzeichnete Art die Sprachspezifikation erschweren würde (da man angeben müßte, welche Vorgänge im Bereich des signierten Typs passen muss, und welche Operationen innerhalb der Reichweite des unsigned Typs passen müssen), aber ansonsten sollte es sein kein Problem, eine Sprache so zu gestalten, dass if (unsigned1 - unsigned2 > unsigned3) ein „numerisch korrekt“ sogar dazu führen, ergeben würde, wenn unsigned2 größer als unsigned1 ist [wenn man unsigned Wraparound will, würde man explizit angeben if ((Uint32)(unsigned1 - unsigned2) > unsigned3)]. Eine Sprache, die ein solches Verhalten angegeben wäre sicherlich eine große Verbesserung gegenüber dem Durcheinander, das in C (gerechtfertigt, angesichts seiner Geschichte) existieren, C # oder vb.net.

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