145
NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <==== 

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

タイプ「NSInteger」の値は、フォーマット引数として使用しないでください。代わりに「long」への明示的なキャストを追加します

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

4

5 に答える 5

194

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

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

更新: iOS 7 は 64 ビットもサポートするようになったため、iOS 用にコンパイルするときに同じ警告が表示されることがあります。

于 2013-04-18T06:43:36.087 に答える
0

を使用している間は警告を発し続けますが、iOS 10 でNSLog(@"%ld", (long)myInt);変更宣言を行うと警告が停止します。long myInt = 1804809223;

于 2016-06-23T17:44:48.197 に答える
-2

OS X は、NSInteger、NSUInteger、CGFloat、CFIndex などのいくつかのデータ型を使用して、32 ビット環境と 64 ビット環境で値を表現する一貫した手段を提供します。32 ビット環境では、NSInteger と NSUInteger はそれぞれ int と unsigned int として定義されます。64 ビット環境では、NSInteger と NSUInteger はそれぞれ long と unsigned long として定義されます。プラットフォームに応じて異なる printf スタイルの型指定子を使用する必要がないように、 このリンクに示されている指定子を 32 ビット環境と 64 ビット環境の両方で使用できます。

于 2016-03-17T11:38:16.837 に答える