有没有办法在核心数据中存储unsigned long?

时间:2012-01-19 15:28:48

标签: cocoa core-data size

CoreData提供Integer 16,Integer 32和Integer 64存储,但不支持任何符号限定符。您可以将unsigned int(32位)存储为有符号长整数(64位),并确保该值保留为整个范围,但无符号长整数似乎需要128位有符号整数来存储,这当然不是'由CoreData支持。有没有办法在coreData中存储unsigned long?

4 个答案:

答案 0 :(得分:4)

[以前的评论已提升回答]

听起来这是对您很重要的位模式,而不是整数值本身。您可以将其存储为已签名 - 只需将其转换为C签名< - >无符号强制转换不强制数学正确性并仅保留位。把它扔掉再使用它。

跟进问题:

一般来说,在(Obj-)C(++)中,您可以将无符号整数值存储到具有等效有符号整数类型的变量中,反之亦然。来自签名的C演员 - >使用2的补码整数时,无符号定义等同于位复制,两种类型的大小相同。走另一条路,未签名 - >签名,是“实现定义” - 实际上通常意味着位复制。铿锵GCC使用两者的位副本,但如果你想绝对肯定你可以使用union

unsigned long r;
long l;

r = (unsigned long)l; // will always work (cast optional)

// following is l = (long)r (cast optional) without "implementation defined" risk
{ union { long sValue; unsigned long uValue; } tmp; tmp.uValue = r; l = tmp.sValue;}

但严重的是我怀疑有人会这样! (注意:Clang至少会将其编译为直接赋值(bit-copy)。)

答案 1 :(得分:2)

如果确实需要64位无符号的完全精度,则可以使其可转换(查看有关存储非标准持久属性的文档)。 CoreData让你可以存储任何方式。但是你可能不需要完整的64位精度......?!?

答案 2 :(得分:0)

您总是可以将[de]序列化为字符串。它并不是特别干净,但只要您能够将其解析为无符号长整数,它就能让您存储它。

答案 3 :(得分:0)

unsigned long不是128位(尚) (或者你有128位CPU吗?)

在Mac上,根据您的CPU架构,它可能是32位或64位。

见:

NSLog( @"%u", sizeof( unsigned long ) );

所以基本上unsigned long将与[{1}}或Integer32兼容。