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

Boo*_*oon 8 primitive objective-c max nsnumber

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

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

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

jtb*_*des 8

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

查看NSNumber文档会显示您可以存储的不同类型的数字:两个最大的整数选项是+numberWithLongLong:(或+numberWithUnsignedLongLong:),它们存储a long long+numberWithInteger:(或+numberWithUnsignedInteger:),它们存储NSInteger.因此,最大NSNumber值受这些类型的限制.

基金会文件指出:

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

编译器是智能的,将创建与数字文字相同类型的NSNumber.如上面的注释中所述,@(1ULL << 32)如果您的计算机的unsigned long long类型超过32位,则可以使用.

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

此外,NSDecimalNumber类(NSNumber的子类)提供了+maximumDecimalNumber可用于查找可存储在N​​SDecimalNumber中的最大值的方法.NSDecimalNumber和浮点类型可能能够存储比整数类型更大的数字,但精度会降低.

  • 您可以存储的最大整数将使用无符号长long,即64位.(18,446,744,073,709,551,615).NSDecimalNumber在技术上是一个不同的类,因此具有不同的最大数量. (3认同)