NSNumbers正在改变

时间:2013-03-10 16:48:50

标签: objective-c core-data nsnumber

我有一个NSNumbers数组,我正在保存到Core Data实体中。

我已将我想设置的NSNumber属性设置为Integer64。

在一些数字上我得到了奇怪的结果,我想知道它是否是一个类型问题。

我有一个临时对象,我填充了在创建时被提取到Core-Data类型对象的数据。

e.g。 [cachableObject setValue:tempObject.number forKey:@"number"];

我放置两个日志语句,一个在上面,另一个在此行下面。

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

这会在两次不正确的事件中记录以下内容(到目前为止):

tempObject.number is 14047556750440521185
cachableObject.number is -4399187323269030431

tempObject.number is 12267813409388115511
cachableObject.number is -6178930664321436105

是什么导致了这个问题?在其他数字上,数字不会改变。

1 个答案:

答案 0 :(得分:2)

14047556750440521185 = 0xC2F2F26FF825DDE1

大于2^63 - 1且超出签名 64位整数的范围。您可以将其存储在无符号 64位整数中,但当解释为 signed 编号时,结果为-4399187323269030431

核心数据使用带符号的64位数字表示Integer 64属性,即使您为其分配了无符号的64位数字,该值也会在内部存储为带符号的64位数字。

如果您知道该值是无符号数,则可以使用

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

再次将其转换为无符号值。