NSNumber が格納できる最大値は?
// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
NSNumber が格納できる最大値は?
// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
NSNumber は実際にはクラス clusterです。つまり、インスタンスを作成すると、それぞれが異なる種類の数値型を格納できるさまざまな具象サブクラスのいずれかを取得する可能性があります。使用可能な実際のタイプとそのサイズは、マシンに依存する場合があります。
NSNumber のドキュメントを見ると、格納できるさまざまな種類の数値が示されます。2 つの最大の整数オプションは、+numberWithLongLong:
(または+numberWithUnsignedLongLong:
) を格納するものlong long
であり、+numberWithInteger:
(or ) はNSInteger+numberWithUnsignedInteger:
を格納するものです。したがって、最大 NSNumber 値はこれらのタイプによって制限されます。
財団の文書には次のように記載されています。
32 ビット アプリケーションを構築する場合、NSInteger は 32 ビット整数です。64 ビット アプリケーションは、NSInteger を 64 ビット整数として扱います。
コンパイラはスマートで、数値リテラルと同じタイプの NSNumber を作成します。上記のコメントで述べたように、@(1ULL << 32)
マシンのunsigned long long
タイプが 32 ビットを超える場合に使用できます。
CFNumberGetByteSize()
さらに、NSNumber はフリーダイヤルで CFNumber にブリッジされています。つまり、自分のような機能を試すことができます。また、CFNumber ドキュメントのNumber Typesセクションを参照してください。これらは基本的に NSNumber オプションと同じであることがわかります。
さらに、NSNumber のサブクラスである NSDecimalNumber クラスは、NSDecimalNumber+maximumDecimalNumber
に格納できる最大値を見つけるために使用できるメソッドを提供します。NSDecimalNumber と浮動小数点型は、整数型よりも大きな数値を格納できる場合がありますが、精度は低下します。