25

我正在尝试将 NSInteger 转换为 NSUInteger 并且我用谷歌搜索并没有找到真正的答案。我该怎么做?

4

4 回答 4

36

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;
于 2011-08-07T05:43:26.750 回答
8

由于这可能对遇到此问题的其他人有用,因此这里有一个小表格,向您展示了投射的实际效果。这些值是直接从调试器中获取的十六进制值。相应地选择,如您所见,铸造确实会产生影响。对于 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
于 2012-02-23T23:14:43.557 回答
3

如果您确定您NSInteger的值大于或等于零,您只需将其转换为NSUIntegerNSUInteger如果您的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
}
于 2014-03-25T18:05:29.693 回答
0

如果您想将整数转换为无符号整数,您要么处于知道整数永远不会为负的情况,要么您可能希望将所有负值转换为绝对值(即无符号值) . 将此转换为绝对值很简单:

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;
于 2014-12-31T18:38:26.630 回答