NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <====
上記のコードはエラーを生成します:
タイプ「NSInteger」の値は、フォーマット引数として使用しないでください。代わりに「long」への明示的なキャストを追加します
修正されたNSLogメッセージは実際にはNSLog(@"%lg", (long) myInt);. 値を表示したい場合 myInt、整数値を に変換する必要があるのはなぜですか?long
NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <====
上記のコードはエラーを生成します:
タイプ「NSInteger」の値は、フォーマット引数として使用しないでください。代わりに「long」への明示的なキャストを追加します
修正されたNSLogメッセージは実際にはNSLog(@"%lg", (long) myInt);. 値を表示したい場合 myInt、整数値を に変換する必要があるのはなぜですか?long
OS X (64 ビット) でコンパイルすると、この警告が表示されます。そのプラットフォームではおよび が 64 ビット整数NSIntegerとして定義されているためです。long一方%i、フォーマットは、int32 ビットの です。そのため、形式と実際のパラメーターのサイズが一致しません。
NSIntegerは 32 ビットまたは 64 ビットであるため、プラットフォームに応じて、コンパイラは一般的にキャストを追加することを推奨しますlong。
更新: iOS 7 は 64 ビットもサポートするようになったため、iOS 用にコンパイルするときに同じ警告が表示されることがあります。
を使用している間は警告を発し続けますが、iOS 10 でNSLog(@"%ld", (long)myInt);変更宣言を行うと警告が停止します。long myInt = 1804809223;
OS X は、NSInteger、NSUInteger、CGFloat、CFIndex などのいくつかのデータ型を使用して、32 ビット環境と 64 ビット環境で値を表現する一貫した手段を提供します。32 ビット環境では、NSInteger と NSUInteger はそれぞれ int と unsigned int として定義されます。64 ビット環境では、NSInteger と NSUInteger はそれぞれ long と unsigned long として定義されます。プラットフォームに応じて異なる printf スタイルの型指定子を使用する必要がないように、 このリンクに示されている指定子を 32 ビット環境と 64 ビット環境の両方で使用できます。