2013-03-10 45 views
0

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

我已经设置了他们的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 

是什么原因造成这个问题?在其他数字上,数字不会改变。

+2

有符号整数溢出 - 您的数字太大。你需要使用无符号整数。 – 2013-03-10 16:57:15

+0

我认为是这样,但不确定在Core-Data模型中为此属性设置的类型。 – jarryd 2013-03-10 16:58:28

+1

你需要用这些数字做数学吗?如果你有能力放弃一些速度(和空间),字符串可能不那么令人头疼。 – danh 2013-03-10 17:03:59

回答

2
14047556750440521185 = 0xC2F2F26FF825DDE1 

大于2^63 - 1更大,超过签署 64位整数的范围内。您可以将其存储在未签名的 64位整数中,但是当解释为时,将签署号码,结果为-4399187323269030431

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

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

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

再次转换为无符号的价值。

+0

谢谢。任何非冲突的数值哈希技术,你可以推荐? – jarryd 2013-03-10 17:01:47

+0

所有的值都在缓存之前进行签名。溢出的将作为无符号整数返回。 – jarryd 2013-03-10 17:04:13

+0

@ Helium3:对不起,但我不明白你最后的评论。你说什么缓存? – 2013-03-10 17:07:15