Ios NSU整数字符串编码32位和64位
我正在尝试找出将整数转换为字符串的最佳方法,该字符串适用于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"
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,你是对的。当我尝试它时,我显然感到困惑。谢谢我删除了我原来的评论,说它引起了一个警告,因为我再试了一次,但没有。