Конвертировать NSInteger в NSUInteger? - PullRequest
21 голосов
/ 07 августа 2011

Я пытаюсь преобразовать NSInteger в NSUInteger, и я нашел его в Google и не нашел реального ответа.Как бы я это сделал?

Ответы [ 4 ]

32 голосов
/ 07 августа 2011

NSInteger и NSUInteger - просто определения типов для примитивных целочисленных типов:

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

Таким образом, вам не нужно «конвертировать» между ними. Простое приведение должно быть достаточно. Как:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;
8 голосов
/ 24 февраля 2012

Так как это может быть полезно для других, сталкивающихся с этой проблемой, вот небольшая таблица, показывающая фактический эффект приведения. Эти значения были взяты прямо из отладчика как шестнадцатеричные значения. Выберите соответственно, как вы видите, кастинг вызывает эффект. Для 32-битной lop off bottom ffffffff и для 16-битной lop off bottom ffffffffffff . Также обратите внимание, что -1 всегда 0xffffffffffffffff.

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
3 голосов
/ 25 марта 2014

Если вы уверены, что ваш NSInteger больше или равен нулю, вы просто разыгрываете его как NSUInteger. Вы не должны приводить к NSUInteger, если ваш NSInteger представляет отрицательное число, так как это может привести к несоответствию.

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

результаты в

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
}
0 голосов
/ 31 декабря 2014

Если вы хотите преобразовать целое число в целое число без знака, вы либо находитесь в ситуации, когда знаете, что целое число никогда не будет отрицательным, либо вам может потребоваться преобразовать все отрицательные значения в абсолютные значения (т. Е.значения без знака).Выполнить это преобразование в абсолютное значение просто:

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

fabs() - это функция C, которая возвращает абсолютное значение для любого числа с плавающей запятой.Здесь myUnsignedInteger будет иметь значение 100.

Возможные варианты использования такой функции будут отображаться, где вы будете указывать отрицательные значения в другом формате.Например, в бухгалтерском учете отрицательные числа отображаются в скобках:

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

Обратите внимание, что с технической точки зрения вы можете просто назначить NSInteger NSUInteger - это даже не требует приведения - но когдаNSInteger отрицателен, NSUInteger возвращает очень большое положительное число, что явно является крайне нежелательным побочным эффектом:

NSUInteger myUnsignedInteger = mySignedInteger;
...