对于64位版本的iOS,我们不能再使用%d
和%u
来格式化NSInteger
和NSUInteger
.因为对于64位,它们的类型定义为long
和unsigned long
,而不是int
和unsigned int
.
因此,如果您试图用%d格式化NSInteger,Xcode将抛出警告.Xcode对我们很好,并为这两种情况提供了一个替代品,它由一个带l前缀的格式说明符和一个长类型转换组成.然后我们的代码基本上如下所示:
NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);
如果你问我的话,这是一种眼睛疼痛.
几天前,Twitter上有人提到了在32位和64位平台上格式化有符号变量的格式说明符%zd
和格式化无符号变量的格式说明符%tu
.
NSLog(@"%zd", i);
NSLog(@"%tu", u);
这似乎有效.我更喜欢打字和打字.
但我真的不知道为什么会这样.现在对我来说,这两个基本上都是神奇的价值观.
我做了一些研究,发现z
前缀意味着下面的格式说明符的大小与size_t
相同.但我完全不知道前缀t
是什么意思.所以我有两个问题:
%zd
和%tu
到底是什么意思?
用%zd
和%tu
代替苹果的建议打字到long是否安全?
I am aware of similar questions and Apples 64-Bit Transition guides, which all recommend the 100 approach. I am asking for an alternative to type casting.