将NSInteger转换为NSUInteger?

Sim*_*iwi 22 objective-c nsinteger nsuinteger

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

aro*_*oth 33

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
Run Code Online (Sandbox Code Playgroud)

因此,您不需要在它们之间"转换".一个简单的演员就足够了.喜欢:

NSInteger myInt = 0;
NSUInteger unsignedInt = (NSUInteger)myInt;
Run Code Online (Sandbox Code Playgroud)

  • 是不是将signed int转换为unsigned int危险?我读到它可能会导致损坏,因为符号位可能被解释为无符号整数的值?或者C是否都在努力防止这种情况发生? (4认同)

tgu*_*unr 8

由于这可能对其他遇到此问题的人有用,因此这里有一个小表格,显示了投射的实际效果.这些值直接从调试器中取为十六进制值.相应地选择,因为你可以看到铸造确实会产生影响.对于32位,丢弃底部ffffffff和16位lop关闭底部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
Run Code Online (Sandbox Code Playgroud)