为什么"长"在各种iDevices上解释kCFPositiveInfinity有什么不同?

时间:2014-04-09 21:57:36

标签: ios 32bit-64bit nsnumber infinity

在搜索无限值时,我一直在修补 NSNumber 一段时间,我遇到了一个有趣的事实。当我这样做时:

long infinity = [((NSNumber *)kCFNumberPositiveInfinity) longValue];

32位模拟器将其解释为 0 ,而64位模拟器将其解释为 -9223372036854775808

现在我记得我的计算机架构101,他们曾经告诉过我们 - 32位= 更小的范围,64位= 更宽的范围。但显然,在64位模拟器上对正无穷大的解释存在溢出(因为我的研究告诉我无穷大很可能是数字)。

问题是 - 这是一个功能(如果是,那么为什么?),或者一个错误?

1 个答案:

答案 0 :(得分:0)

使用32位模拟器,

如果您从(NSNumber *)kCFNumberPositiveInfinity创建一个对象,如下所示:

NSObject *dummy = (NSNumber *)kCFNumberPositiveInfinity;

并检查它,你会看到它是这样的:

dummy = (__NSCFNumber *)(double)inf

当你将它转换为这样的长值时:

long longDummy = [(NSNumber *)dummy longValue];

它被设置为0

如果你只是像这样设置一个长值:

long testDummy = kCFNumberPositiveInfinity;

它设置为53994368

问题(无论是错误还是意外实施)都采用此调用的格式

[((NSNumber *)kCFNumberPositiveInfinity) longValue];

你强制它到一个NSNumber,默认为double,因为它不知道更好,然后从double获得longValue。