使用 64 位版本的 iOS,我们不能再使用%d
and%u
来格式化NSInteger
和NSUInteger
. 因为对于 64 位,这些是 typedef 到long
andunsigned long
而不是int
and unsigned int
。
因此,如果您尝试使用 %d 格式化 NSInteger,Xcode 会抛出警告。Xcode 对我们很好,它提供了这两种情况的替代品,它包括一个以 l 为前缀的格式说明符和一个类型转换为 long。那么我们的代码基本上是这样的:
NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);
如果你问我,那是眼睛疼痛。
几天前,Twitter 上有人提到了格式化有符号%zd
变量的格式说明符,以及%tu
在 32 位和 64 位平台上格式化无符号变量的格式说明符。
NSLog(@"%zd", i);
NSLog(@"%tu", u);
这似乎有效。我喜欢的不仅仅是类型转换。
但老实说,我不知道为什么这些工作。现在两者对我来说基本上都是神奇的价值。
我做了一些研究,发现z
前缀意味着以下格式说明符的大小与size_t
. 但我完全不知道前缀是什么t
意思。所以我有两个问题:
究竟是什么%zd
意思%tu
?
使用它是否安全,%zd
而%tu
不是苹果建议将类型转换为长?
我知道类似的问题和 Apples 64-Bit Transition guides,它们都推荐这种%lu (unsigned long)
方法。我要求替代类型转换。