【发布时间】:2012-01-19 15:28:47
【问题描述】:
CoreData 提供 Integer 16、Integer 32 和 Integer 64 存储,但不支持任何符号限定符。您可以将无符号整数(32 位)存储为有符号长整数(64 位)并确保在整个范围内保留该值,但无符号长整数似乎需要存储 128 位有符号整数,这当然不是t 受 CoreData 支持。那么有什么方法可以将 unsigned long 存储在 coreData 中吗?
【问题讨论】:
CoreData 提供 Integer 16、Integer 32 和 Integer 64 存储,但不支持任何符号限定符。您可以将无符号整数(32 位)存储为有符号长整数(64 位)并确保在整个范围内保留该值,但无符号长整数似乎需要存储 128 位有符号整数,这当然不是t 受 CoreData 支持。那么有什么方法可以将 unsigned long 存储在 coreData 中吗?
【问题讨论】:
[上一条评论提升为回答]
听起来是位模式对您很重要,而不是整数值本身。您可以将其存储为有符号的 - 只需将其转换为 C 有符号 无符号转换不会强制数学正确性,而只是保留位。将其重新投射以使用它。
跟进问题:
在 (Obj-)C(++) 中通常是的,您可以将无符号整数值存储到具有 等效 有符号整数类型的变量中,反之亦然。当使用 2 的补码整数并且两种类型的大小相同时,根据定义,从有符号 -> 无符号的 C 转换等同于位复制。反过来,无符号 -> 有符号是“定义的实现” - 实际上 通常 意味着位复制。 Clang 和 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 至少会将其编译为直接赋值(位复制)。)
【讨论】:
如果您真的需要 64 位无符号的完整精度,您可以将其 可转换(查看有关存储 非标准持久属性的文档强>)。 CoreData 可以让你以这种方式存储任何东西。但是您可能不需要完整的 64 位精度...?!?
【讨论】:
unsigned long 还不是 128 位。
(或者你有 128 位 CPU?)
在 Mac 上,根据您的 CPU 架构,它可能是 32 位或 64 位。
查看:
NSLog( @"%u", sizeof( unsigned long ) );
所以基本上unsigned long 将与Integer32 或Integer64 兼容。
【讨论】:
NSNumber 将 unsigned long 存储为带符号的 128 位值(因为在内部它将所有整数存储为带符号的)。
您始终可以将 [反] 序列化为字符串。它不是特别干净,但它使您能够存储它,只要您可以将其解析回无符号长整数。
【讨论】: