NSIntegerのフォーマット指定はlongで
iPhone, iPadアプリを32bit, 64bit両対応でコーディングするには、intやfloatの代わりに、NSInteger, CGFloatなどを使うことが多い。NSIntegerやCGFloatは、コンパイル時のプラットフォーム指定によって切り替えられる単なるtypedefなので、printf形式の書式指定を使うときには注意が必要だ。
以下は64bitでコンパイルするとWarningになる。
NSInteger i; NSLog(@"%d", i);
以下は32bitでコンパイルするとWarningになる。
NSInteger i; NSLog(@"%ld", i);
公式サイトによると、以下が正しい指定だそうだ。
NSInteger i; NSLog(@"%ld", (long)i);
少々面倒くさい。
OS Xは、32ビット環境と64ビット環境において一貫した値の表現手段を提供するために、NSInteger, NSUInteger, CGFloat, CFIndexなどのいくつかのデータ型を使います。32ビット環境では、NSIntegerはint、NSUIntegerはunsigned intとしてそれぞれ定義されます。64ビット環境では、NSIntegerはlong、NSUIntegerはunsigned longとしてそれぞれ定義されます。プラットフォームに依存した、それぞれ異なるprintfスタイルの書式指定が必要となることを避けるためには、以下の書式指定を使用してください。
注意:いくつかの状況で値のキャストが必要です。NSInteger
%ld または %lx
値をlongにキャストすること。NSUInteger
%lu または %lx
値をunsigned longにキャストすること。CGFloat
%f または %g
%fはフォーマット時にはfloatに対してもdoubleに対しても有効です。
ただし、scanfするときは、一度%ldとしてdouble変数に読み込んでからCGFloat変数にコピーしてください。
(この辺かなり省略気味に意訳してます)CFIndex
%ld または %lx
NSIntegerと同様。ポインタ
%p または %zx
%pは先頭に0xをつけます。それがいらない場合はキャストなしで%zxを使ってください。
(と書いてありますが、ポインタを%zxでフォーマットすると警告が出ました。%zxはsize_t型の書式指定だそうです。Xcode5.1.1)