2013-02-21 112 views
7

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

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

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

答案已经回答了实际问题,所以我会解释错误。 '1 << 32'中的'1'是一个int,编译器在执行转换时使用它。由于int是32位,所以不能移位32位。如果你使用'@(1ULL << 32)',它会工作,因为'1ULL'有一个无符号long long类型。 – ughoavgfhw 2013-02-21 05:41:11

+0

谢谢,非常好的信息。 – Boon 2013-02-21 15:03:53

+1

这个问题为什么被拒绝?投票拖延? – Boon 2013-02-22 14:46:53

回答

8

的NSNumber实际上是一个class cluster,这意味着当你创建一个实例您可以得到任何的各种具体子类,每一个能够存储不同类型的数值型的。可用的实际类型及其大小可能与机器有关。

纵观NSNumber documentation显示了不同类型,你可以存储数字:最大的两个整数的选择将是+numberWithLongLong:(或+numberWithUnsignedLongLong:),其存储long long+numberWithInteger:(或+numberWithUnsignedInteger:),它存储了NSInteger。最大的NSNumber值因此受到这些类型的限制。

基金会文档指出:

当建立32位应用程序,NSInteger的是一个32位的整数。一个64位应用程序将NSInteger视为一个64位整数。

编译器很聪明,会创建一个与数字文字相同类型的NSNumber。如上述注释中所述,如果您的机器的unsigned long long类型多于32位,则可以使用@(1ULL << 32)

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

此外,NSDecimalNumber类,的NSNumber的子类,提供了+maximumDecimalNumber方法,该方法可用于发现可以被存储在一个NSDecimalNumber的最大值。 NSDecimalNumber和浮点类型可能能够存储比整数类型更大的数字,但精度会降低。

+0

'NSNumber * value = @(pow(2,128));'? – Sebastian 2013-02-21 05:36:56

+1

@Sebastian因为'pow'返回一个'double',所以编译器会使用'+ numberWithDouble:'(或者相当于这个的东西)。 – jtbandes 2013-02-21 05:38:43

+0

所以它明显大于最长的'long long' – Sebastian 2013-02-21 05:44:45

相关问题