4

データ型int32_tを使用してiOS用のビットマスクを作成しています。次に、これはNSIntegerを受け入れる変数に設定されます。これは期待どおりにコンパイル時エラーをスローしませんが、私は疑問に思っていました-これが将来実行時エラーを引き起こす可能性がある何らかの方法がありましたか?

4

1 に答える 1

7

一般的に、それは動作します。NSIntegerは常に少なくとも32ビット長になります。64ビットの場合、番号は一致するように符号拡張されます(キャストする必要がある場合があります)。実行時エラーは発生しません。


NSIntegerに関する詳細情報

NSIntegerは、(NSObjCRuntime.hからの)次のコードを使用して定義されます。

#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

これは、64ビット、組み込みOS、iPhone、Windows用にコンパイルする場合、または64ビットのように32ビットを構築NSIntegerする場合と同等であることを意味します。longそれ以外の場合は、と同等intです。intとは同等であるためint32_t、OS X上の32ビットアプリケーションで問題ありません。他の状況では、のサイズによって異なりますlong

64ビットOSXアプリケーションでlongは、は64ビットの数値です。iPhoneではlong、32ビットの数値です。私はWindowsについて知りません、そして64ビットのように32ビットを構築するときにそれが32ビットまたは64ビットの長さを使用するかどうかわかりません。

于 2011-03-29T18:39:26.687 に答える