无符号整数字符串编码32位和64位

3

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

我看到的所有解决方案都需要进行一些强制转换,或者似乎不正确。 使用下面的代码会收到警告,要求我添加显式转换。

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

我也尝试了 %d (有符号整数,但似乎不正确),以及 %lx,但都不正确。谢谢。


1
你尝试过使用%u作为格式说明符吗? - neutrino
那似乎是没有警告就能工作的。那也适用于64位吗? - James Paolantonio
我认为应该可以,但是我现在手头没有Mac来尝试。 - neutrino
2
不会。对于64位系统,NSUInteger 是 unsigned long,而对于32位系统,则是 unsigned int。如果您在编译64位二进制文件时使用 %u 用于 NSUInteger,就会收到警告信息。 - neilco
@neilco 是的,你说得对。 - neutrino
3个回答

6

根据String Programming Guide

OS X使用多种数据类型——NSIntegerNSUIntegerCGFloatCFIndex,以提供一致性的表示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];

@Bilko,你是正确的。当我尝试它时,我显然很困惑。谢谢。我删除了我的原始评论,因为我再次尝试了它,它没有引起警告。 - Gerry Shaw

-1
根据64位转换指南

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

因此,您可以执行以下操作:
#if __LP64__
    NSString *string = [NSString stringWithFormat:@"postStatus == %lu", unsignedInteger];
#else
    NSString *string = [NSString stringWithFormat:@"postStatus == %u", unsignedInteger];
#endif

有没有更好的方法用if-else来实现这个? - James Paolantonio
@JamesPaolantonio 你可以检查 unsigned long 的大小,即 if (sizeof(unsigned long) == 4) { /* 32-bit */ } else { /* 64-bit */ } - neilco
抱歉,我的意思是不用if-else。 - James Paolantonio
不,没有。NSUInteger 没有通用的格式字符串。 - neilco
这不是一个很好的做法。请参见下面的Aaron Berger的答案,该答案符合Apple的建议:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW5 - Bill

-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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接