简体   繁体   English

将NSInteger转换为NSUInteger?

[英]Convert NSInteger to NSUInteger?

I am trying to convert a NSInteger to a NSUInteger and I googled it and found no real answer. 我试图将NSInteger转换为NSUInteger并且我用Google搜索并发现没有真正的答案。 How would I do this? 我该怎么做?

NSInteger and NSUInteger are just typedefs for primitive integer types: 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

As such, you don't need to "convert" between them. 因此,您不需要在它们之间“转换”。 A simple cast should be sufficient. 一个简单的演员就足够了。 Like: 喜欢:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;

Since this might be useful for other coming across this issue here is a little table showing you the actual effect of casting. 由于这可能对其他遇到此问题的人有用,因此这里有一个小表格,显示了投射的实际效果。 These values were taken straight from the debugger as hex values. 这些值直接从调试器中取为十六进制值。 Choose accordingly, as you can see casting does cause effects. 相应地选择,因为你可以看到铸造确实会产生影响。 For 32-bit, lop off the bottom ffffffff and for 16-bit lop off bottom ffffffffffff . 对于32位,丢弃底部ffffffff和16位lop关闭底部ffffffffffff Also note, -1 is always 0xffffffffffffffff. 另请注意,-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

If you are certain that your NSInteger is greater than or equal to zero, you simply cast it as NSUInteger . 如果您确定您的NSInteger大于或等于零,则只需将其NSUIntegerNSUInteger You should not be casting to NSUInteger if your NSInteger represents a negative number, as it may lead to inconsistency. 你不应该铸造NSUInteger如果您NSInteger代表负数,因为它可能导致不一致。

NSInteger signedInteger = -30;
NSUInteger unsignedInteger = (NSUInteger)signedInteger;

results in 结果是

整数结果

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
}

If you are wanting to convert an integer to an unsigned integer, you are either in a situation where you know that the integer will never be negative, or you may be wanting all negative values to be converted to absolute values (ie, unsigned values). 如果您想要将整数转换为无符号整数,则您可能知道整数永远不会为负数,或者您可能希望将所有负值转换为绝对值(即无符号值) 。 Doing this conversion to an absolute value is straightforward: 将此转换为绝对值非常简单:

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

fabs() is a C function that returns an absolute value for any float. fabs()是一个C函数,它返回任何float的绝对值。 Here, myUnsignedInteger would have a value of 100. 在这里, myUnsignedInteger的值为100。

Possible use cases for such a function would be display where you will indicate the negative values in a different format. 将显示此类函数的可能用例,您将以不同的格式指示负值。 For instance, in accounting negative numbers are displayed in parentheses: 例如,在会计中,负数显示在括号中:

NSString * numberForDisplay;
if (mySignedInteger < 0) {
    numberForDisplay = [NSString stringWithFormat:@"(%lu)", myUnsignedInteger];
} else {
    numberForDisplay = [NSString stringWithFormat:@"%lu", myUnsignedInteger];
}

Note that from a technical point of view, you could simply assign an NSInteger to an NSUInteger—this does not even require a cast—but when the NSInteger is negative the NSUInteger will return a very large positive number, which is clearly a highly undesirable side effect: 请注意,从技术角度来看,您可以简单地将NSInteger分配给NSUInteger - 这甚至不需要强制转换 - 但是当NSInteger为负数时,NSUInteger将返回一个非常大的正数,这显然是一个非常不受欢迎的方面影响:

NSUInteger myUnsignedInteger = mySignedInteger;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM