1

乱数を作成し、次のようにNSNumberオブジェクトに保存しています。

NSNumber *index = [NSNumber numberWithUnsignedInt:arc4random_uniform(2^32-1)];

私も試しました:

NSNumber *index = [NSNumber numberWithUnsignedInt:arc4random_uniform(4294967295)];
NSNumber *index = @(arc4random_uniform(4294967295));

ある時点で、私は次のように番号1も割り当てています。

NSNumber *index = @(1);

これは私に正の数だけを与えるはずです。

後で、次のようにこれらの番号を印刷します。

NSString *string = [NSString stringWithFormat:@"%@", index];

これにより、乱数にいくつかの負の値が与えられ、1は1として出力されます。

NSString *string = [NSString stringWithFormat:@"%u", index.unsignedIntValue];

私は正の数だけを取得します-私はそうします-しかし今、1もいくつかの大きな正の数として突然印刷されています。

何が起きてる?u_int32(arc4randomが返す)をNSNmberに正しく格納し、それらが正のみであることを確認するにはどうすればよいですか?

4

2 に答える 2

0

使用する

NSNumber *index = [NSNumber numberWithUnsignedInt:arc4random_uniform(exp2(32)-1)];

私は負の数を得ることはありません。arc4random_uniform(x)常に 0 ~ x の数値を返し、そこから生成された NSNumber の文字列値は正しいです。

編集: exp2(31) を exp2(32) に置き換えました

于 2013-03-01T10:32:55.360 に答える
0

コメントで、インデックスは「Integer 32」属性として Core Data エンティティに格納されていると述べましたが、それが問題の原因であると思います。

Core Data は、管理対象オブジェクト クラスのすべての属性 (および関係) のゲッター メソッドとセッター メソッドを動的に生成します。これらのアクセサー メソッドは、インスタンス変数によってバックアップされる「通常の」 @syntheized アクセサー メソッドとは異なります。

「Integer 32」属性の場合、Core Data は属性に (符号付き) 整数を使用し、値を設定すると、値は にキャストまたは切り捨てられintます。例:

e.index = [NSNumber numberWithUnsignedInt:0xFFFFFFF0U];
// This would give the same result:
// e.index = [NSNumber numberWithLongLong:0x1234FFFFFFF0LL];
NSNumber *val = e.index;
NSLog(@"value=%@, type=%s", val, [val objCType]);
// Output: value=-16, type=i

出力type=iは、値にint.

範囲内の符号なし整数が必要な場合0 .. 2^32-1は、(すでに行ったように)次のいずれかを使用できますunsignedIntValue

unsigned x = [val unsignedIntValue];

または属性を「Integer 64」として保存します。

備考:

  • これは の問題ではないと確信していarc4random_uniformます。
  • 最初のコード例では、べき乗ではなく排他的arc4random_uniform(2^32-1)論理和であることに注意してください。^
于 2013-03-01T12:48:36.980 に答える