将NSInteger转换为NSUInteger?

时间:2011-08-07 05:38:11

标签: objective-c nsinteger nsuinteger

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

4 个答案:

答案 0 :(得分:32)

NSIntegerNSUInteger只是原始整数类型的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;

答案 1 :(得分:8)

因为这对于遇到这个问题的其他人来说可能是有用的,这里有一个小表格,显示了投射的实际效果。这些值直接从调试器中取为十六进制值。相应地选择,因为你可以看到铸造确实会产生影响。对于32位,删掉底部的 ffffffff 和16位的lop off off 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

答案 2 :(得分: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
}

答案 3 :(得分:0)

如果您想要将整数转换为无符号整数,您可能会遇到整数永远不会为负的情况,或者您可能希望将所有负值转换为绝对值(即,无符号值)。将此转换转换为绝对值非常简单:

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

fabs()是一个C函数,它返回任何float的绝对值。在这里,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;