我有一个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
是什么导致了这个问题?在其他数字上,数字不会改变。
答案 0 :(得分:2)
14047556750440521185 = 0xC2F2F26FF825DDE1
大于2^63 - 1
且超出签名 64位整数的范围。您可以将其存储在无符号 64位整数中,但当解释为 signed 编号时,结果为-4399187323269030431
。
核心数据使用带符号的64位数字表示Integer 64
属性,即使您为其分配了无符号的64位数字,该值也会在内部存储为带符号的64位数字。
如果您知道该值是无符号数,则可以使用
unsigned long long x = [cachableObject.number unsignedLongLongValue];
再次将其转换为无符号值。