有什么方法可以在核心数据中存储未签名的long?

Ton*_*ony 5 size cocoa core-data

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

CRD*_*CRD 5

[之前的评论升级为答案]

听起来对您来说重要的是位模式,而不是整数值本身。您可以将其存储为有符号的 - 只需将其转换为 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;}
Run Code Online (Sandbox Code Playgroud)

但说实话,我怀疑有人会这么做!(注意:Clang 至少会将其编译为直接赋值(位复制)。)