0

我有一组 NSNumbers 我保存到核心数据实体中。

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

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

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

例如[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

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

4

1 回答 1

2
14047556750440521185 = 0xC2F2F26FF825DDE1

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

Core Data 使用带符号的 64 位数字作为Integer 64属性,即使您为其分配一个无符号的 64 位数字,该值也会在内部存储为带符号的 64 位数字。

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

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

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

于 2013-03-10T17:00:03.973 回答