我正在尝试将 NSInteger 转换为 NSUInteger 并且我用谷歌搜索并没有找到真正的答案。我该怎么做?
4 回答
NSInteger
并且NSUInteger
只是原始整数类型的 typedef:
#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;
由于这可能对遇到此问题的其他人有用,因此这里有一个小表格,向您展示了投射的实际效果。这些值是直接从调试器中获取的十六进制值。相应地选择,如您所见,铸造确实会产生影响。对于 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
如果您确定您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
}
如果您想将整数转换为无符号整数,您要么处于知道整数永远不会为负的情况,要么您可能希望将所有负值转换为绝对值(即无符号值) . 将此转换为绝对值很简单:
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;