我正在尝试将NSInteger转换为NSUInteger并且我用Google搜索并发现没有真正的答案。我该怎么做?
答案 0 :(得分:32)
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;
答案 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;
结果
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;