Core data 我应该使用核心数据中的哪个NSNumber(整数16、32、64)来保持整数

Core data 我应该使用核心数据中的哪个NSNumber(整数16、32、64)来保持整数,core-data,nsuinteger,Core Data,Nsuinteger,我想在我的核心数据中保留整数,但我不知道应该使用哪种类型(整数16、32、64)来满足所需的空间 据我了解: Integer 16 can have minimum value of -32,768 to 32,767 Integer 32 can have minimum value of -2,147,483,648 to 2,147,483,647 Integer 64 can have minimum value of -very large to very large NSUInte

我想在我的核心数据中保留整数,但我不知道应该使用哪种类型(整数16、32、64)来满足所需的空间

据我了解:

Integer 16 can have minimum value of -32,768 to 32,767
Integer 32 can have minimum value of -2,147,483,648 to 2,147,483,647
Integer 64 can have minimum value of -very large to very large
NSUInteger是无符号long的类型def,它等于无符号int()

因此,如果我使用numberWithUnsignedInteger:将NSUInteger转换为NSNumber,并将其保存为NSNumber(Integer 32),我可以安全地检索数据,对吗?

您真的需要NSUInteger的整个范围吗?在iOS上,这是一个无符号的32位值,它可能会变得非常大。它将找到一个有符号的64位


但是你可能不需要那么精确。
uint32_t
的最大值为
uint32_MAX
,即4294967295(40亿)。如果你每秒增加一次,你需要136年以上的时间才能达到这个值。您用户的iPhone届时将无法使用…:)

如果可能,在将数据写入磁盘或通过网络写入数据时,最好明确说明值的大小。根据需要的范围,使用
uint16\u t
uint32\u t
uint64\u t
而不是使用NSUInteger作为数据类型。然后在核心数据中将其自然转换为整数16、32和64

理解为什么,考虑这个场景:

  • 您选择使用Integer 64类型来存储值
  • 在64位iOS设备(如iPhone 6)上,它存储5000000000的值
  • 在32位iOS设备上,此值从存储中提取为
    nsuiger
    (使用NSNumber的
    unsignedIntegerValue
  • 现在,由于32位设备上的
    NSUInteger
    仅为32位,因此该数字不再是5000000000,因为没有足够的位来表示50亿。如果将步骤3中的
    numinteger
    替换为
    uint64\u t
    ,则该值仍将为50亿

    如果您绝对必须使用NSUInteger,那么您只需要对上述问题保持警惕,并为其编写防御代码

    至于将无符号值存储到看似有符号的核心数据类型中,您可以安全地存储和检索它们:

    NSManagedObject *object = // create object
    object.valueNumber = @(4000000000); // Store 4 billion in an Integer 32 Core Data type
    [managedObjectContext save:NULL] // Save value to store
    
    // Later on
    NSManagedObject *object = // fetch object from store
    uint32_t value = object.valueNumber.unsignedIntegerValue; // value will be 4 billion
    

    这并不能真正回答问题。你怎么知道他在存储什么样的数据?当我需要存储一个远大于40亿的数字时,我有很多实例。例如:
    var str2=“小字符串和大hashValue”
    print(str2.hashValue)
    /4799450061348893706
    毫无帮助-也许他使用int作为在32个单独属性上存储状态的一种方式-32个属性将翻转所有位并将事情弄得一团糟