NSInteger 変数をフォーマット引数として使用する場合、なぜ long にキャストする必要があるのでしょうか? 質問する

NSInteger 変数をフォーマット引数として使用する場合、なぜ long にキャストする必要があるのでしょうか? 質問する
NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <==== 

上記のコードはエラーを生成します:

'NSInteger' 型の値はフォーマット引数として使用しないでください。代わりに 'long' への明示的なキャストを追加してください。

修正されたNSLogメッセージは実際には です。値を表示したい場合、NSLog(@"%lg", (long) myInt);の整数値をmyIntに変換する必要があるのはなぜですか?long

ベストアンサー1

OS X (64 ビット) でコンパイルすると、この警告が表示されます。これは、そのプラットフォームではNSIntegerが として定義されlong、 が 64 ビット整数であるためです。%i一方、 の形式は でありint、これは 32 ビットです。したがって、形式と実際のパラメータのサイズは一致しません。

NSIntegerはプラットフォームに応じて 32 ビットまたは 64 ビットであるため、コンパイラはlong一般にキャストを追加することを推奨します。

アップデート:iOS 7 も 64 ビットをサポートしているため、iOS 用にコンパイルするときに同じ警告が表示されることがあります。

おすすめ記事