NSUInteger vs. NSInteger, int vs. unsigned und ähnliche Fälle

Lesezeit: 3 Minuten

Benutzer-Avatar
Jess Armand

Hat jemand das Fachwissen, um zu erklären, wann NSUInteger und wann NSInteger zu verwenden ist?

Ich habe Cocoa-Methoden gesehen, die NSInteger zurückgeben, selbst in Fällen, in denen der zurückgegebene Wert immer unsigned ist.

Was ist der grundlegende Grund? Ist NSInteger oder int streng darauf beschränkt, wenn wir einen negativen Wert darstellen wollen?

Von NSObjCRuntime.h:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Benutzer-Avatar
Erik Abele

Sie sollten sich auch der Konvertierungsregeln für Ganzzahlen bewusst sein, wenn Sie mit NSUInteger vs. NSInteger umgehen:

Das folgende Fragment gibt beispielsweise 0 (falsch) zurück, obwohl Sie erwarten würden, dass es 1 (wahr) ausgibt:

NSInteger si = -1;
NSUInteger ui = 1;
printf("%d\n", si < ui);

Der Grund ist, dass die [si] Variable wird implizit in ein unsigned int konvertiert!

Sehen CERTs Website für sichere Codierung für eine eingehende Diskussion über diese “Probleme” und wie man sie löst.

Benutzer-Avatar
Krishna Kishore

Standardmäßig wird davon ausgegangen, dass eine ganze Zahl vorzeichenbehaftet ist. Mit anderen Worten, der Compiler geht davon aus, dass eine ganzzahlige Variable aufgerufen wird, um entweder eine negative oder eine positive Zahl zu speichern. Dies begrenzt das Ausmaß, das die Reichweite in beiden Richtungen erreichen kann. Beispielsweise hat ein 32-Bit-int einen Bereich von 4.294.967.295. Da der Wert positiv oder negativ sein kann, beträgt der Bereich in der Praxis tatsächlich –2.147.483.648 bis +2.147.483.647. Wenn wir wissen, dass eine Variable niemals zum Speichern eines negativen Werts aufgerufen wird, können wir sie als vorzeichenlos deklarieren und dadurch den (positiven) Bereich auf 0 bis +4.294.967.295 erweitern. Ich würde also sagen, es ist in Ordnung, NSInteger zu verwenden, wenn Sie wissen, dass Sie einen eingeschränkten Ausgabebereich haben. Ich persönlich verwende NSUInteger, wenn ich wirklich große, nur positive Zahlen zurückgeben musste

  • Gute Antwort und was ich wissen musste 🙂

    – Mac

    8. Mai 2017 um 18:24 Uhr

  • Was ist, wenn ich -4.294.967.295 speichern möchte? Ich kann NSInteger dann nicht verwenden?

    – Nr. 5

    16. Mai 2017 um 8:03 Uhr

  • @Nil long long int: -9.223.372.036.854.775.807 bis 9.223.372.036.854.775.807 unsigned long long int: 0 bis 18.446.744.073.709.551.615. Ziemlich viel Geld, um es auf Ihrem Konto zu haben 😀

    – Naveed Abbas

    27. Oktober 2017 um 14:45 Uhr


Wenn Ihre Methode einen entsprechend eingeschränkten Ausgabebereich hat, können Sie auch verwenden NSInteger da es einfacher zu tippen ist. Wie Sie sagen, wenn Sie negative Zahlen zurückgeben müssen, NSInteger ist das einzige Spiel in der Stadt; Ich würde nur verwenden NSUInteger wenn ich zurück musste Ja wirklich große Zahlen aus irgendeinem Grund.

  • Verwenden Sie für noch größere Zahlen NSDecimalNumber für 38 Stellen mit einer Genauigkeit von Basis 10.

    – Codekrieger

    31. März 2010 um 23:42 Uhr

  • +1, @codewarrior, jedoch nur, wenn Sie Klassen weitergeben können.

    – Karl Norum

    31. März 2010 um 23:46 Uhr

  • Ich gehe den anderen Weg: Ich verwende NSUInteger immer, außer wenn ich negative Zahlen brauche. Außerdem meinst du Objekte, keine Klassen; Es gibt nur sehr wenige Gründe, Klassen weiterzugeben, und noch weniger Gründe, speziell die Klasse NSDecimalNumber zu übergeben.

    – Peter Hosey

    3. April 2010 um 2:26 Uhr

  • Ich denke, es hängt wirklich von unseren Bedürfnissen ab.

    – Jesse Armand

    16. Juli 2010 um 20:39 Uhr

Benutzer-Avatar
AaronLS

Ich weiß nicht speziell über Kakao Bescheid, aber normalerweise ist der einzige Nachteil von vorzeichenbehafteten Ganzzahlen, dass sie normalerweise die Hälfte des maximalen Werts als unsigned int haben. Etwa 2 Milliarden statt 4 Milliarden für 32-Bit-Systeme. Im Allgemeinen ist dies kein großer Unterschied, denn wenn Sie es mit Werten nahe 2 Milliarden zu tun haben, wären Sie im selben Fall wahrscheinlich genauso besorgt über ein Maximum von 4 Milliarden, da es mit nur einem immer noch ziemlich nahe an einem Überlauf liegt Multiplikation von 2 oder 3.

Vorzeichenbehaftete Ganzzahlen werden normalerweise wegen der zusätzlichen Flexibilität und der Tatsache bevorzugt, dass eine vorzeichenbehaftete Ganzzahl in fast allen Szenarien verwendet werden kann, in denen eine vorzeichenlose Ganzzahl verwendet werden kann, sowie in allen zusätzlichen Szenarien, in denen ein Negativ benötigt wird.

Unsigned ist möglicherweise vorzuziehen, wenn Sie nur positive Werte erzwingen möchten.

1385660cookie-checkNSUInteger vs. NSInteger, int vs. unsigned und ähnliche Fälle

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy