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 &lt;&lt; 32 中的 1 是一个 int,编译器在执行移位时使用它。由于 int 是 32 位,因此您不能将其移动 32 个位置。如果你使用@(1ULL &lt;&lt; 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 &lt;&lt; 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 可以存储的最大值是多少?的主要内容,如果未能解决你的问题,请参考以下文章

dataframe最大存储多少数据?

mysql varchar 最大可以设置多少

PHP中int的最大值是多少?

Mysql一个表中 最多能存多少文字? 一列中varchar最大值允许多少?

MySQL的VARCHAR最大值是多少

gcp 实例可以与单个网络接口一起使用的最大带宽是多少?