NSNumber 可以存储的最大值是多少?
// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
NSNumber 可以存储的最大值是多少?
// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
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 和浮点类型可能能够存储比整数类型更大的数字,但精度会降低。