NSUInteger字符串编码32和64位

时间:2013-10-15 21:23:53

标签: ios cocoa-touch 64-bit

我试图找出将NSUInteger转换为适用于32位和64位系统的字符串的最佳方法。我看到两个平台的NSUInteger定义不同,我想确保我所做的是正确的。

我见过的所有解决方案都需要一些铸造,或者看起来不正确。我收到一个警告,下面的代码要求我添加一个明确的演员。

NSUInteger unsignedInteger = PostStatusFailed; // This is an enum
NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];

我也尝试了%d(签名的ints,这似乎不正确)和%lx,但似乎都没有。感谢。

3 个答案:

答案 0 :(得分:6)

来自String Programming Guide

  

OS X使用多种数据类型 - NSIntegerNSUIntegerCGFloat和   CFIndex - 提供一致的方法来代表32-   和64位环境。在32位环境中,NSInteger和   NSUInteger分别定义为intunsigned int。在   64位环境NSIntegerNSUInteger定义为long和   分别为unsigned long。避免使用不同的需要   printf样式类型说明符取决于平台,您可以使用   表3中显示的说明符。请注意,在某些情况下,您可能有   投下价值。

查看所有类型的链接。对于NSUInteger,正确的方法是:

NSUInteger i = 42;
NSString *numberString = [NSString stringWithFormat:@"%lu is the answer to life, the universe, and everything.", (unsigned long)i];

答案 1 :(得分:-1)

根据64-bit Transition Guide

  

编译64位运行时时,编译器会定义 LP64 宏。

所以你可以这样做:

#if __LP64__
    NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];
#else
    NSString *string = [NSString stringWithFormat:@"postStatus == %u", unsignedInteger];
#endif

答案 2 :(得分:-1)

在32位环境中,NSInteger和NSUInteger分别定义为int和unsigned int。在64位环境中,NSInteger和NSUInteger分别定义为long和unsigned long。

所以有一个NSNumber以获得最佳方式。

当你想要获得一个NSString时,就像这个格式化为NSNumber那样。

NSUInteger unsignedInteger = PostStatusFailed; // This is an enum
NSString *string = [NSString stringWithFormat:@"postStatus == %@", @(unsignedInteger)];

%@ ---> @(NSUInteger),你看@(),它是一个NSNumber。