8

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

// ok
    NSNumber *value = @(1 << 31); 

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

1 回答 1

8

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

查看NSNumber 文档向您展示了可以存储的不同类型的数字:两个最大的整数选项是+numberWithLongLong:(or +numberWithUnsignedLongLong:),它存储一个long long,和+numberWithInteger:(or +numberWithUnsignedInteger:),它存储一个NSInteger。因此,最大 NSNumber 值受这些类型的限制。

基金会文件指出:

在构建 32 位应用程序时,NSInteger 是一个 32 位整数。64 位应用程序将 NSInteger 视为 64 位整数。

编译器很聪明,会创建一个与数字文字相同类型的 NSNumber。正如上面评论中提到的,@(1ULL << 32)如果您的机器具有unsigned long long超过 32 位的类型,则可以使用。

此外,NSNumber 与 CFNumber 是免费桥接的,这意味着您可以尝试像CFNumberGetByteSize()自己一样的功能 - 并查看 CFNumber 文档的Number Types部分。您会看到这些与 NSNumber 选项基本相同。

此外,NSDecimalNumber 类(NSNumber 的子类)提供了+maximumDecimalNumber一种方法,您可以使用该方法来查找可以存储在 NSDecimalNumber 中的最大值。NSDecimalNumber 和浮点类型可能能够存储比整数类型更大的数字,但精度会降低。

于 2013-02-21T05:31:19.850 回答