Ios NSU整数字符串编码32位和64位

Ios NSU整数字符串编码32位和64位,ios,cocoa-touch,64-bit,Ios,Cocoa Touch,64 Bit,我正在尝试找出将整数转换为字符串的最佳方法,该字符串适用于32位和64位系统。我发现这两个平台的定义不同,我想确保我所做的是正确的 我看到的所有解决方案都需要一些铸造,或者看起来不正确。我收到一条警告,下面的代码要求我添加显式强制转换 NSUInteger unsignedInteger = PostStatusFailed; // This is an enum NSString *string = [NSString stringWithFormat:@"postStatus == %lu"

我正在尝试找出将整数转换为字符串的最佳方法,该字符串适用于32位和64位系统。我发现这两个平台的定义不同,我想确保我所做的是正确的

我看到的所有解决方案都需要一些铸造,或者看起来不正确。我收到一条警告,下面的代码要求我添加显式强制转换

NSUInteger unsignedInteger = PostStatusFailed; // This is an enum
NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];
我还尝试了
%d
(带符号的整数,似乎不正确)和
%lx
,但似乎都不正确。谢谢。

根据:

编译器在为64位运行时编译时定义LP64

所以你可以这样做:

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

OSX使用多种数据类型—
NSInteger
NSInteger
CGFloat
,以及
CFIndex
-提供一致的方法来表示32中的值- 和64位环境。在32位环境中,
NSInteger
NSUInteger
分别定义为
int
无符号int
。在里面 64位环境、
NSInteger
NSInteger
定义为
long
无符号long
。避免使用不同的 printf样式类型说明符取决于平台,您可以使用 如表3所示的说明符。请注意,在某些情况下,您可能会 来铸造价值

请参阅所有类型的链接。对于
NSUInteger
,正确的方法是:

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

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

所以要有一个最佳方式的号码

当你想得到一个NSString时,像这样格式化为NSNumber

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

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

您是否尝试过将%u作为格式规范?这似乎在没有警告的情况下工作。这也适用于64位?我想应该可以,但我手头没有Mac电脑可以试用。它不会。对于64位,整数是
无符号长
,而对于32位,整数是
无符号整数
。如果您使用
%u
作为整数,并且正在编译一个64位二进制文件,您会得到警告。@neilco是的,您是对的。使用if-else有什么好办法吗?@JamesPaolantonio您可以检查
无符号长
的大小,即
如果(sizeof(unsigned long)==4){/*32-bit*/}else{/*64-bit*/}对不起,我的意思是没有if-else。不,没有。整数没有通用格式字符串。这不是一个很好的方法。下面是亚伦·伯杰的回答,这与苹果的建议相符:@Bilko,你是对的。当我尝试它时,我显然感到困惑。谢谢我删除了我原来的评论,说它引起了一个警告,因为我再试了一次,但没有。