0

ヘッダーを見ると、私がコンパイルしている 64 ビット システムでは、NSUInteger と UInt32 の両方が 32 ビットの符号なし整数として定義されていることがわかります。他?

「暗黙的な変換は整数の精度を失います: 'NSUInteger' (別名 'unsigned long') から 'UInt32' (別名 'unsigned int')」

警告が 1 つを 'long' として、もう 1 つを 'int' として参照していることがわかりますが、このシステムではどちらも同じ 32 ビットの符号なし整数に解決されるため、精度が失われることはありません。

実際には問題はありませんが、おそらく何かを誤解しているように見えるので、理解を深めたいと思います。

この質問がありましたが、「なぜ」ではなく安全性に対処しています: UInt32 を NSUInteger に安全に保存できますか?

4

2 に答える 2

4

64 ビット OS X プラットフォームの場合:

  • NSUIntegerとして定義されunsigned long
  • unsigned long64 ビットの符号なし整数です。

そのため、コンパイラの警告を説明する同じサイズではUInt32ありNSUIntegerません。

「Foundation Data Types Reference」のNSUIntegerも参照してください。

32 ビット アプリケーションを構築する場合、NSUInteger は 32 ビットの符号なし整数です。64 ビット アプリケーションは、NSUInteger を 64 ビット符号なし整数として扱います。

注意: 64 ビット OS X は (多くの Unix および Unix 系システムと同様に) LP64データ モデルを使用します。これは、longおよびポインターが 64 ビットであることを意味します。64 ビット Windows は IL32P64 データ モデルを使用します。long32 ビットで、ポインターは 64 ビットです。

于 2013-03-04T09:36:52.877 に答える
2

NSUIntegerOSXだけでNSIntegerなくiOSでも使えます。

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger;
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger;
#endif

iOS は 32 ビット デバイスですが、OSX は 64 ビットです (以前の OSX は 32 ビットであり、32 ビット OS 用のアプリケーションを作成することもできます)。したがって、if-else directive設定されているベースが含まれています。

OSX では常に with を使用%ldしますNSIntegerが、iOS では%d.

使用%dするNSIntegerと、整数精度が失われるという警告が表示されます。

于 2013-03-04T09:34:17.550 に答える