NSNumber可以存储的最大值是多少?NSNumber可以存储的最大值是多少?
// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
NSNumber可以存储的最大值是多少?NSNumber可以存储的最大值是多少?
// ok
NSNumber *value = @(1 << 31);
// gives compiler error, so max NSNumber is 32-bit uint?
NSNumber *value = @(1 << 32);
的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和浮点类型可能能够存储比整数类型更大的数字,但精度会降低。
答案已经回答了实际问题,所以我会解释错误。 '1 << 32'中的'1'是一个int,编译器在执行转换时使用它。由于int是32位,所以不能移位32位。如果你使用'@(1ULL << 32)',它会工作,因为'1ULL'有一个无符号long long类型。 – ughoavgfhw 2013-02-21 05:41:11
谢谢,非常好的信息。 – Boon 2013-02-21 15:03:53
这个问题为什么被拒绝?投票拖延? – Boon 2013-02-22 14:46:53