2013-04-24 6 views
9

Oft sind Werte positiv bekannt. Zum Beispiel ist die TCP/UDP-Sequenznummer immer ein positiver Wert. Sowohl int als auch unsigned int sind groß genug, um sogar die größten sequence number zu speichern, so dass ich jeden dieser Typen verwenden kann. Es gibt viele andere Beispiele, bei denen bekannt ist, dass Werte positiv sind.Sollte ich jedes Mal "unsigned" verwenden, wenn ich weiß, dass ich nicht signierte Werte verarbeite?

Gibt es Gründe, unsigned Typ zu verwenden, wenn die Kapazität des normalen signed Typs ausreicht (und oft mehr als genug)?

Persönlich neige ich dazu, regelmäßige Typen zu verwenden, weil:

  • int wahrscheinlich ein bisschen besser lesbar ist als uint oder unsigned int
  • Ich muss nicht enthalten zusätzliche Header für UINT usw.
  • Ich werde weitere Umwandlungen irgendwo im Programm weiter vermeiden.

Gründe für die Verwendung unsigned Typ kann ich mir vorstellen:

  • Hilfe Compiler generiert besseren Code?
  • Hilfe ein anderer Programmierer diese Variable zu verstehen ist unsigned
  • vermeiden mögliche Fehler
(zum Beispiel beim int UINT Compiler zugewiesen wird wahrscheinlich Fehler Compile-Zeit generiert und wir sollten diesen Wert überprüfen wir vergeben nicht negativ ist)
+0

Einige Gedanken dazu hier: http://embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on- signed-and-unsigned-integers/ – Morwenn

+1

danke, auch ich habe diese Frage gerade jetzt http://stackoverflow.com/questions/12225521/should-unsigned-ints-be-used-if-not-necessary?rq= gefunden 1 – javapowered

+1

Nein. Es gibt einige Argumente gegen die Verwendung von 'unsigned' - Stroustrup spielt darauf an, irgendwo in der Programmiersprache C++ - Lakos ging davon und schrieb ein Kapitel darüber in einem seiner Bücher: langweilig. Beispielprobleme: Wenn Sie die Werte a und b haben, funktioniert 'abs (a - b)' intuitiv für Ints, aber nicht vorzeichenlos; und es ist bemerkenswert, dass Standard-Conversions stillschweigend eingesetzt werden können, so dass die Art von Checks, die Sie möglicherweise von unsigned bekommen, sowieso nicht funktionieren - negative Werte werden lautlos groß und umgekehrt. –

Antwort

1

Ein Grund ist, dass der Vergleich von vorzeichenbehafteten und vorzeichenlosen Zahlen zu überraschenden Ergebnissen führen kann. In C und (denke ich) C++ bewirkt der Vergleich von vorzeichenbehafteten und vorzeichenlosen Zahlen, dass die vorzeichenbehaftete Zahl als vorzeichenlos interpretiert wird. Wenn der vorzeichenbehaftete Wert negativ ist, wird ein vorzeichenloser Wert einen GRÖSSEREN Wert ergeben als eine vorzeichenlose Zahl, was nicht gewünscht ist. Ein Beispiel in Objective-C, das die gleichen Konvertierungsregeln wie C verwendet, finden Sie in this question.

Verwandte Themen