3

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

我见过的所有解决方案都需要一些转换,或者看起来不正确。我收到以下代码的警告,要求我添加显式演员表。

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

我也尝试过%d(签名整数,这似乎不正确),并且%lx,但似乎都不正确。谢谢。

4

3 回答 3

6

字符串编程指南

OS X 使用多种数据类型——<code>NSInteger、、、NSUIntegerCGFloat—— CFIndex来提供在 32 位和 64 位环境中表示值的一致方法。在 32 位环境中,NSIntegerNSUInteger分别定义为intunsigned int。在 64 位环境中,NSIntegerNSUInteger分别定义为longunsigned long。为避免需要根据平台使用不同的 printf 样式类型说明符,您可以使用表 3 中显示的说明符。请注意,在某些情况下,您可能必须转换值。

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

NSUInteger i = 42;
NSString *numberString = [NSString stringWithFormat:@"%lu is the answer to life, the universe, and everything.", (unsigned long)i];
于 2013-10-25T16:46:52.460 回答
-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。

于 2014-09-16T01:39:55.727 回答
-1

根据64 位转换指南

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

所以你可以做这样的事情:

#if __LP64__
    NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];
#else
    NSString *string = [NSString stringWithFormat:@"postStatus == %u", unsignedInteger];
#endif
于 2013-10-15T22:00:18.313 回答