Я пытаюсь преобразовать NSInteger в NSUInteger, и я искал его и не нашел реального ответа. Как мне это сделать?
Преобразовать NSInteger в NSUInteger?
Ответ 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;
приводит к
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;