Подтвердить что ты не робот

Преобразовать NSInteger в NSUInteger?

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

4b9b3361

Ответ 1

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

#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;

Ответ 2

Так как это может быть полезно для других, сталкивающихся с этой проблемой, вот небольшая таблица, показывающая фактический эффект кастинга. Эти значения были взяты прямо из отладчика в виде шестнадцатеричных значений. Выберите соответственно, так как вы видите, что литье вызывает эффекты. Для 32-битного, вырезать снизу ffffffff и для 16-битного отвала 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

Если вы уверены, что ваш 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
}

Ответ 4

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

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;