NSNumber 可以存储的最大值是多少?
Posted
技术标签:
【中文标题】NSNumber 可以存储的最大值是多少?【英文标题】:What's the largest value an NSNumber can store? 【发布时间】:2013-02-21 05:25:48 【问题描述】:// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
【问题讨论】:
答案已经回答了实际问题,所以我将解释错误。1 << 32
中的 1
是一个 int,编译器在执行移位时使用它。由于 int 是 32 位,因此您不能将其移动 32 个位置。如果你使用@(1ULL << 32)
,它会起作用,因为1ULL
有一个无符号长长类型。
谢谢,非常好的信息。
为什么这个问题会被否决?投反对票?
【参考方案1】:
NSNumber 实际上是一个class cluster,这意味着当您创建一个实例时,您可能会获得各种具体子类中的任何一个,每个子类都能够存储不同类型的数字类型。可用的实际类型及其大小可能取决于机器。
查看NSNumber documentation 向您展示了您可以存储的不同类型的数字:两个最大的整数选项是+numberWithLongLong:
(或+numberWithUnsignedLongLong:
),它存储一个long long
和+numberWithInteger:
(或+numberWithUnsignedInteger:
),其中存储了一个NSInteger。因此,最大 NSNumber 值受这些类型的限制。
基金会文档指出:
在构建 32 位应用程序时,NSInteger 是一个 32 位整数。 64 位应用程序将 NSInteger 视为 64 位整数。
编译器很聪明,会创建一个与你的数字字面量相同类型的 NSNumber。如上面的 cmets 所述,如果您的机器具有超过 32 位的 unsigned long long
类型,则可以使用 @(1ULL << 32)
。
此外,NSNumber 可免费桥接到 CFNumber,这意味着您可以自己试用 CFNumberGetByteSize()
之类的功能 — 并查看 CFNumber 文档的 Number Types 部分。您会看到这些与 NSNumber 选项基本相同。
此外,NSDecimalNumber 类(NSNumber 的子类)提供了+maximumDecimalNumber
方法,您可以使用该方法查找可以存储在 NSDecimalNumber 中的最大值。 NSDecimalNumber 和浮点类型可能能够存储比整数类型更大的数字,但精度会降低。
【讨论】:
NSNumber *value = @(pow(2, 128));
呢?
@Sebastian 由于pow
返回double
,编译器将使用+numberWithDouble:
(或与之等效的东西)。
那时您可以存储的最大整数将使用无符号长整型,即 64 位。 (18,446,744,073,709,551,615)。 NSDecimalNumber 在技术上是一个不同的类,因此具有不同的最大数量。
谢谢大家。我更新了我的答案以解决不同类型的最大值。
@lnafziger 您的评论应该是公认的答案。以上是关于NSNumber 可以存储的最大值是多少?的主要内容,如果未能解决你的问题,请参考以下文章