%d
iOS の 64 ビット バージョンでは、 and%u
をフォーマットするために使用できなくNSInteger
なりNSUInteger
ました。long
64 ビットの場合、これらはandunsigned long
の代わりにint
andにtypedef されるためですunsigned int
。
そのため、NSInteger を %d でフォーマットしようとすると、Xcode は警告をスローします。Xcode は私たちに親切で、l プレフィックスの書式指定子と long への型キャストで構成されるこれら 2 つのケースの代替を提供します。次に、コードは基本的に次のようになります。
NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);
あなたが私に尋ねると、それは目の痛みです。
数日前、Twitter の誰かが、32 ビットおよび 64 ビット プラットフォームで符号付き変数をフォーマットし、符号なし変数をフォーマット%zd
するためのフォーマット指定子について言及しました。%tu
NSLog(@"%zd", i);
NSLog(@"%tu", u);
これはうまくいくようです。そして、タイプキャスティングよりも好きです。
しかし、正直なところ、なぜそれらが機能するのかわかりません。今のところ、どちらも基本的に私にとって魔法の価値です。
少し調べてみたところ、z
接頭辞は、次の書式指定子が と同じサイズであることを意味することがわかりましたsize_t
。t
しかし、接頭辞の意味がまったくわかりません。だから私は2つの質問があります:
正確には何%zd
を%tu
意味しますか?
Apple の提案の代わりに long にタイプキャストするの%zd
は安全ですか?%tu
同様の質問とAppleの64ビット移行ガイドを認識しており、これらはすべて%lu (unsigned long)
アプローチを推奨しています。型キャストに代わるものを求めています。