it-swarm.com.de

Konvertieren NSInteger zu NSUInteger?

Ich versuche eine NSInteger in eine NSUInteger umzuwandeln und habe sie gegoogelt und keine richtige Antwort gefunden. Wie würde ich das machen?

21
SimplyKiwi

NSInteger und NSUInteger sind nur typedefs für primitive Ganzzahlentypen

#if __LP64__ || NS_BUILD_32_LIKE_64
  typedef long NSInteger;
  typedef unsigned long NSUInteger;
#else
  typedef int NSInteger;
  typedef unsigned int NSUInteger;
#endif

Daher müssen Sie nicht zwischen ihnen "konvertieren". Eine einfache Besetzung sollte ausreichen. Mögen:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;
32
aroth

Da dies für andere Benutzer hilfreich sein könnte, finden Sie hier eine kleine Tabelle mit den tatsächlichen Auswirkungen des Castings. Diese Werte wurden direkt vom Debugger als Hex-Werte übernommen. Wählen Sie entsprechend, da das Casting Auswirkungen hat. Für 32-Bit lop off die bottom ffffffff und für 16-bit lop off bottom ffffffffff . Beachten Sie auch, dass -1 immer 0xffffffffffffff ist. 

NSInteger si = NSIntegerMax;    // si   NSInteger   0x7fffffffffffffff
si = -1;                        // si   NSInteger   0xffffffffffffffff
si = (NSInteger)-1;             // si   NSInteger   0xffffffffffffffff
si = (NSUInteger)-1;            // si   NSInteger   0xffffffffffffffff
si = NSUIntegerMax;             // si   NSInteger   0xffffffffffffffff
si = (NSInteger)NSIntegerMax;   // si   NSInteger   0x7fffffffffffffff
si = (NSUInteger)NSIntegerMax;  // si   NSInteger   0x7fffffffffffffff
si = (NSInteger)NSUIntegerMax;  // si   NSInteger   0xffffffffffffffff
si = (NSUInteger)NSUIntegerMax; // si   NSInteger   0xffffffffffffffff

NSUInteger ui = NSUIntegerMax;  // ui   NSUInteger  0xffffffffffffffff
ui = -1;                        // ui   NSUInteger  0xffffffffffffffff
ui = (NSInteger)-1;             // ui   NSUInteger  0xffffffffffffffff
ui = (NSUInteger)-1;            // ui   NSUInteger  0xffffffffffffffff
ui = NSIntegerMax;              // ui   NSUInteger  0x7fffffffffffffff
ui = (NSInteger)NSIntegerMax;   // ui   NSUInteger  0x7fffffffffffffff
ui = (NSUInteger)NSIntegerMax;  // ui   NSUInteger  0x7fffffffffffffff
ui = (NSInteger)NSUIntegerMax;  // ui   NSUInteger  0xffffffffffffffff
ui = (NSUInteger)NSUIntegerMax; // ui   NSUInteger  0xffffffffffffffff
8
tgunr

Wenn Sie sicher sind, dass Ihre NSInteger größer oder gleich Null ist, setzen Sie sie einfach in NSUInteger um. Sie sollten nicht zu NSUInteger wechseln, wenn Ihre NSInteger eine negative Zahl darstellt, da dies zu Inkonsistenzen führen kann.

NSInteger signedInteger = -30;
NSUInteger unsignedInteger = (NSUInteger)signedInteger;

führt in

integer results

if (unsignedInteger == signedInteger) {
    // is TRUE
}
if (signedInteger == 4294967266) {
    // is FALSE
}
if (signedInteger == -30) {
    // is TRUE
}
if (unsignedInteger == 4294967266) {
    // is TRUE
}
if (unsignedInteger == -30) {
    // is TRUE
}
3
Brian

Wenn Sie eine Ganzzahl in eine vorzeichenlose Ganzzahl konvertieren möchten, befinden Sie sich entweder in einer Situation, in der Sie wissen, dass die Ganzzahl niemals negativ ist, oder Sie möchten, dass alle negativen Werte in absolute Werte (dh vorzeichenlose Werte) konvertiert werden. . Diese Umwandlung in einen absoluten Wert ist unkompliziert:

NSInteger mySignedInteger = -100;
NSUInteger myUnsignedInteger = fabs(mySignedInteger);

fabs() ist eine C-Funktion, die einen absoluten Wert für jeden Float zurückgibt. Hier hätte myUnsignedInteger einen Wert von 100.

Mögliche Anwendungsfälle für eine solche Funktion wären Anzeigen, bei denen die negativen Werte in einem anderen Format angezeigt werden. Beispielsweise werden in der Buchhaltung negative Zahlen in Klammern angezeigt:

NSString * numberForDisplay;
if (mySignedInteger < 0) {
    numberForDisplay = [NSString stringWithFormat:@"(%lu)", myUnsignedInteger];
} else {
    numberForDisplay = [NSString stringWithFormat:@"%lu", myUnsignedInteger];
}

Aus technischer Sicht können Sie einem NSUInteger einfach einen NSInteger zuweisen (dies erfordert nicht einmal eine Umwandlung). Wenn jedoch der NSInteger negativ ist, gibt der NSUInteger eine sehr große positive Zahl zurück, was eindeutig eine höchst unerwünschte Seite ist bewirken:

NSUInteger myUnsignedInteger = mySignedInteger;
0
Duncan Babbage