2013-02-21 16 views
7

NSNumberに保存できる最大の価値は何ですか?NSNumberに保存できる最大の価値は何ですか?

// ok 
    NSNumber *value = @(1 << 31); 

// gives compiler error, so max NSNumber is 32-bit uint? 
    NSNumber *value = @(1 << 32); 
+5

答えはすでに実際の質問に回答しているので、エラーについて説明します。 '1 << 32'の' 1'はintで、コンパイラはシフトを実行するときにこれを使用します。 intは32ビットなので、32ポジションはシフトできません。 '@(1ULL << 32)'を使った場合、 '1ULL'はunsigned long longの型を持っているので動作します。 – ughoavgfhw

+0

ありがとう、非常に良い情報。 – Boon

+1

この質問はなぜ投票されるのですか?ダウントローリングですか? – Boon

答えて

8

するNSNumberは、インスタンスの作成時に具象サブクラスの任意の様々な、数値型の異なる種類を格納する各能力を取得することができることを意味し、実際にclass clusterです。使用可能な実際のタイプとそのサイズは、マシンによって異なる場合があります。 2つの最大の整数オプションがNSInteger格納+numberWithLongLong:(または+numberWithUnsignedLongLong:)、long long蓄積し、+numberWithInteger:(または+numberWithUnsignedInteger:)、次のようになります。NSNumber documentationを見て

あなたが保存できる番号の種類を示しています。したがって、最大NSNumber値はこれらのタイプによって制限されます。

Foundationのマニュアル状態:

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

コンパイラはスマートで、数字リテラルと同じタイプのNSNumberを作成します。上記のコメントのように、マシンにunsigned long longタイプが32ビットを超える場合は、@(1ULL << 32)を使用できます。

また、NSNumberはフリーダイヤルでCFNumberにブリッジされています。つまり、CFNumberGetByteSize()などの機能を試してみることができます。また、CFNumberのマニュアルのNumber Typesセクションをご覧ください。これらは基本的にNSNumberオプションと同じです。

さらに、NSNumberのサブクラスであるNSDecimalNumberクラスは、+maximumDecimalNumberメソッドを提供します。このメソッドを使用して、NSDecimalNumberに格納できる最大値を見つけることができます。 NSDecimalNumberおよび浮動小数点型は、整数型よりも大きな数を格納することができますが、精度は低下します。

+0

'NSNumber * value = @(pow(2,128));'? – Sebastian

+1

@Sebastian 'pow'は' double'を返すので、コンパイラは '+ numberWithDouble:'(またはこれに相当するもの)を使用します。 – jtbandes

+0

それは明らかに最大のlong longよりも大きい – Sebastian

関連する問題