0

CoreDataエンティティに保存しているNSNumberの配列があります。

Integer64に設定したいNSNumberプロパティを設定しました。

いくつかの数字で奇妙な結果が出て、それがタイプの問題かどうか疑問に思っています。

作成時にCore-Dataタイプのオブジェクトに抽出されるデータを入力する一時オブジェクトがあります。

例えば[cachableObject setValue:tempObject.number forKey:@"number"];

この行の上に1つ、下にもう1つ、2つのログステートメントを配置します。

NSLog(@"tempObject.number is %@", tempObject.number);
[cachableObject setValue:tempObject.number forKey:@"number"];
NSLog(@"cachableObject.number is %@", cachableObject.number);

これにより、(これまでのところ)2つの誤った発生について以下がログに記録されます。

tempObject.number is 14047556750440521185
cachableObject.number is -4399187323269030431

tempObject.number is 12267813409388115511
cachableObject.number is -6178930664321436105

この問題の原因は何ですか?他の番号では、番号は変更されません。

4

1 に答える 1

2
14047556750440521185 = 0xC2F2F26FF825DDE1

符号付き64ビット整数2^63 - 1の範囲を超えています。符号なし64ビット整数で格納できますが、符号付き数値として解釈すると、結果は。になります。-4399187323269030431

Core Dataは、Integer 64属性に符号付き64ビット数値を使用し、符号なし64ビット数値を割り当てた場合でも、値は符号付き64ビット数値として内部に格納されます。

値が符号なしの数値であることがわかっている場合は、次を使用できます。

unsigned long long x = [cachableObject.number unsignedLongLongValue];

再度符号なしの値に変換します。

于 2013-03-10T17:00:03.973 に答える