我正在尝试创建一个使用非常大数字的应用。我想知道[NSNumber numberWithUnsignedLongLong]的存储能力是否是我能得到的最大数量?如果NSUInteger具有与[NSNumber numberWithUnsignedLongLong]相同的存储能力?
答案 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
?不,这取决于平台,可以是int
或long
,但不是long long
。只需使用unsigned long long
或typedef
,例如:
typedef unsigned long long MYULongLong
您可以使用大小类型,例如uint64_t
,但NSNumber
上没有匹配大小的方法。你可以通过使用基于NSNumber
的类别和条件代码将这些方法添加到sizeof
来解决这个问题 - 你可以写一点,这样条件在编译期间全部消失,这是一个练习; - )
HTH