NSInteger和NSUInteger处于混合的64位/ 32位环境中

Pie*_*ter 28 64-bit objective-c ios arm64

我在NSLog/NSAssert等调用中有相当数量的字符串格式说明符,它们分别使用%d%u使用NSInteger (= int on 32bit)NSUInteger (= unsigned int on 32bit)类型.

将应用程序转换为64位时,会发出警告(当然),正如%ld %lu现在成为的类型longunsigned long类型所预期的那样.

简单地转换格式说明符当然会在32位构建中引入反向警告.
因此,我认为唯一可以免于警告的解决方案是使用64位说明符,并在34位值的类型中转换为34位值,并在32位构建中给出警告.

但我想知道是否有专门针对NSIntegerNSUInteger类型的格式说明符可以在没有强制转换的情况下在两种架构上工作?

ily*_* n. 61

我认为最安全的方法是将它们装入NSNumber实例中.

NSLog(@"Number is %@", @(number)); // use the highest level of abstraction
Run Code Online (Sandbox Code Playgroud)

由于标记指针魔法,这个拳击通常不必创建新对象.

如果你真的不想使用NSNumber,你可以手动投射原始类型,正如其他人建议的那样:

NSLog(@"Number is %ld", (long)number); // works the same on 32-bit and 64-bit
Run Code Online (Sandbox Code Playgroud)

  • 如果将`NSUInteger`的显式转换插入到`unsigned long`但将其更改为`NSInteger`,则对于没有警告的负值会出现错误的行为.`@()`保证在所有情况下都有效. (6认同)

小智 38

您还可以在登录控制台时使用%zd(NSInteger)和%tu(NSUInteger).

NSInteger integer = 1;
NSLog(@"first number: %zd", integer);

NSUInteger uinteger = 1;
NSLog(@"second number: %tu", uinteger);
Run Code Online (Sandbox Code Playgroud)

也可以在这里找到.