NSNumber可以存储的最大值是多少?

8
NSNumber能够存储的最大值是多少?
// ok
    NSNumber *value = @(1 << 31); 

// gives compiler error, so max NSNumber is 32-bit uint?
    NSNumber *value = @(1 << 32); 

6
答案已经回答了实际问题,所以我将解释一下错误。在1 << 32 中的 1 是一个 int 类型,编译器在执行移位时使用它。由于 int 类型是 32 位的,因此您无法将其移动 32 个位置。如果您使用了 @(1ULL << 32),它将有效,因为 1ULL 的类型是 unsigned long long。 - ughoavgfhw
1
为什么这个问题会被投票否决?是不是投票恶作剧? - Boon
1个回答

8

NSNumber实际上是一个类簇,这意味着当您创建一个实例时,您可能会得到任何一种不同数字类型的具体子类,每个子类都能够存储不同类型的数字。可用的实际类型及其大小可能依赖于机器。

看一下NSNumber文档,它展示了你可以存储的不同类型的数字:最大的两个整数选项分别是+numberWithLongLong:(或+numberWithUnsignedLongLong:),它们存储一个long long,以及+numberWithInteger:(或+numberWithUnsignedInteger:),它们存储一个NSInteger。因此,NSNumber的最大值受这些类型的限制。
Foundation文档指出:
在构建32位应用程序时,NSInteger是一个32位整数。64位应用程序将NSInteger视为64位整数。
编译器很聪明,会创建与您的数字文字相同类型的NSNumber。如上面的评论中所提到的,如果您的机器具有超过32位的无符号长整型,则可以使用@(1ULL << 32)
此外,NSNumber是toll-free桥接到CFNumber,这意味着您可以尝试自己的函数,例如CFNumberGetByteSize(),并查看CFNumber文档的Number Types部分。您将看到这些基本上与NSNumber选项相同。
此外,NSDecimalNumber类是NSNumber的子类,提供+maximumDecimalNumber方法,可用于查找可以存储在NSDecimalNumber中的最大值。 NSDecimalNumber和浮点类型可能能够存储比整数类型更大的数字,尽管精度会降低。

NSNumber *value = @(pow(2, 128)); 这个怎么样? - Sebastian
1
@Sebastian 由于 pow 返回一个 double,编译器将使用 +numberWithDouble:(或类似的内容)。 - jtbandes
3
您可以使用无符号长整型(unsigned long long)来存储的最大整数是18446744073709551615,即64位。NSDecimalNumber是一种不同的类别,因此其最大数字是不同的。 - lnafziger
谢谢大家。我更新了我的答案,以解决不同类型的最大值问题。 - jtbandes
@lnafziger,您的评论应该被接受为答案。 - user5890979

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接