Vorzeichenlose und vorzeichenbehaftete Zahlen als Indizes

8

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

In Python können Sie vom Ende eines Arrays aus indizieren, indem Sie negative Zahlen senden. Dies ist jedoch in .Net nicht der Fall. Es ist nicht einfach für .Net, ein solches Feature später hinzuzufügen, da es anderen Code möglicherweise mit speziellen Regeln brechen könnte (ja, eine schlechte Idee, aber ich denke, dass es passiert) beim Indizieren.

Nicht, dass ich jemals Arrays über 2.147.483.647 indexieren müsste, aber ich kann wirklich nicht verstehen, warum sie vorzeichenbehaftete Zahlen wählen.

Kann es sein, dass es normaler ist, vorzeichenbehaftete Zahlen im Code zu verwenden?

Bearbeiten: Ich habe gerade diese Links gefunden:

Die Gefahren der nicht signierten Iteration in C / C ++

Signierte Wortlängen und Indizes

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

  • Historische Gründe, da es eine c-ähnliche Sprache ist
  • Interop mit c
simendsjo 17.06.2010, 08:30
quelle

4 Antworten

3

Der Einfachheit halber natürlich. Mögen Sie Probleme , die Größenarithmetik mit unsignierten Ints ausführen?

    
Rotsor 17.06.2010, 08:43
quelle
4

Es kann die lange Tradition sein, einen Wert unter 0 als ungültigen Index zu verwenden. Methoden wie String.IndexOf geben -1 zurück, wenn das Element nicht gefunden wird. Daher muss der Rückgabewert unterzeichnet werden. Wenn Indexkonsumenten vorzeichenlose Werte erfordern würden, müssten Sie a) überprüfen und b) den Wert für die Verwendung verwenden. Mit signierten Indizes brauchen Sie nur den Scheck.

    
Arne 17.06.2010 08:38
quelle
2

Unsigned ist nicht CLS-konform.

    
Hans Olsson 17.06.2010 08:33
quelle
0

Die primäre Nützlichkeit von Zahlen ohne Vorzeichen entsteht, wenn man größere Zahlen aus kleineren zusammensetzt und umgekehrt. Wenn Sie beispielsweise vier vorzeichenlose Bytes von einer Verbindung erhalten und ihren Wert als Ganzes als 32-Bit-Ganzzahl betrachten möchten, können Sie mit vorzeichenlosen Typen einfach sagen:

%Vor%

Im Gegensatz dazu wäre ein Ausdruck wie der obige komplizierter, wenn die Bytes signiert wären.

Ich bin mir nicht sicher, ob ich wirklich einen Grund für eine Sprache sehe, die heutzutage keine vorzeichenlosen Versionen aller Typen vorsieht, die kürzer sind als der längste vorzeichenbehaftete Integer-Typ, mit der Semantik, die ganzzahlig ist (also diskrete Mengenzahlen, anstatt Operationen eines bestimmten Typs), die vollständig in den größten signierten Typ passen, werden standardmäßig so ausgeführt, als ob sie auf diesen Typ angewendet würden. Das Einfügen einer vorzeichenlosen Version des größten signierten Typs würde die Sprachspezifikation komplizierter machen (da man angeben müsste, welche Operationen in den Bereich des signierten Typs passen müssen und welche Operationen in den Bereich des Typs ohne Vorzeichen passen müssen), ansonsten sollte dies der Fall sein kein Problem, eine Sprache so zu gestalten, dass if (unsigned1 - unsigned2 > unsigned3) ein "numerisch korrektes" Ergebnis liefert, selbst wenn unsigned2 größer ist als unsigned1 [wenn man unsigned wraparound möchte, würde man explizit if ((Uint32)(unsigned1 - unsigned2) > unsigned3) ] angeben. Eine Sprache, die ein solches Verhalten spezifiziert, wäre sicherlich eine große Verbesserung gegenüber dem Chaos, das in C (gerechtfertigt, angesichts seiner Geschichte), C # oder vb.net existiert.

    
supercat 10.07.2012 16:43
quelle

Tags und Links