首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在核心数据中存储无符号的long?

问有没有办法在核心数据中存储无符号的long?
EN

Stack Overflow用户
提问于 2012-01-19 23:28:48
回答 4查看 3.2K关注 0票数 5

CoreData提供整数16、整数32和整数64存储,但不支持任何符号限定符。您可以将无符号整型(32位)存储为有符号长整型(64位),并确保在整个范围内保留该值,但无符号长整型似乎需要128位有符号整数来存储,这当然不受CoreData支持。那么有没有办法在coreData中存储无符号的长整型呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-20 12:01:43

升级到答案的上一条评论

听起来对你来说重要的是位模式,而不是整数值本身。您可以将其存储为带符号的类型--只需将其转换为C带符号的<->无符号类型转换不会强制执行数学正确性,而只是保留位。将其抛回以使用它。

后续问题:

在(Obj-)C(++)中,通常是yes,您可以将无符号整数值存储到具有等价有符号整数类型的变量中,反之亦然。当使用2的补码整数并且两种类型的大小相同时,根据定义,来自有符号->的C类型转换等同于位拷贝。另一种方式,未签名的->签名,是“实现定义的”-这在实践中通常意味着位复制。Clang和GCC都使用位拷贝,但如果你想绝对确定你可以使用union

代码语言:javascript
复制
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至少会将其编译为直接赋值(位复制)。)

票数 4
EN

Stack Overflow用户

发布于 2012-01-20 01:46:54

如果您确实需要64位无符号的完整精度,您可以将其设置为可转换的(请查看有关存储非标准持久属性的文档)。CoreData让你可以用这种方式存储任何东西。但您可能不需要完整的64位精度...?!?

票数 2
EN

Stack Overflow用户

发布于 2012-01-19 23:32:39

unsigned long还不是128位。

(或者你有128位的CPU?)

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

请参阅:

代码语言:javascript
复制
NSLog( @"%u", sizeof( unsigned long ) );

因此,从根本上说,Integer32或Integer64将与unsigned long兼容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8928715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档