NSUInteger是否等于[NSNumber numberWithUnsignedLongLong]?

时间:2014-01-29 19:46:16

标签: ios objective-c

我正在尝试创建一个使用非常大数字的应用。我想知道[NSNumber numberWithUnsignedLongLong]的存储能力是否是我能得到的最大数量?如果NSUInteger具有与[NSNumber numberWithUnsignedLongLong]相同的存储能力?

3 个答案:

答案 0 :(得分:1)

NSUInteger是基本c类型的typedef。具体类型取决于您的平台:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 ||        NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

因此,大小可能因C的实现而异,但无符号长度至少为32位,无符号长整数至少为64位。

当你担心溢出时,使用你知道尺寸的类型可能会更好。如果需要,它们总是可以包含在Objective-C类型中。

保存UINT64_MAX的数字的uint64_t可能很有用。

#define UINT64_MAX (18446744073709551615ULL) 

答案 1 :(得分:0)

只需使用uint64_t(64位无符号整数,与unsigned long long相同)。

除非您将vales存储在Objective-C集合类(例如NSNumber)中,否则不希望使用NSArray,因为它们是不可变的,因此它们非常困难且昂贵。操纵。

答案 2 :(得分:0)

你是[*]可以存储在NSNumber unsigned long long中的最大无符号整数类型是正确的 - 并且在当前系统上期望它是64位。

此类型是否等同于NSUInteger?不,这取决于平台,可以是intlong,但不是long long。只需使用unsigned long longtypedef,例如:

typedef unsigned long long MYULongLong

您可以使用大小类型,例如uint64_t,但NSNumber上没有匹配大小的方法。你可以通过使用基于NSNumber的类别和条件代码将这些方法添加到sizeof来解决这个问题 - 你可以写一点,这样条件在编译期间全部消失,这是一个练习; - )

HTH