在搜索无限值时,我一直在修补 NSNumber 一段时间,我遇到了一个有趣的事实。当我这样做时:
long infinity = [((NSNumber *)kCFNumberPositiveInfinity) longValue];
32位模拟器将其解释为 0 ,而64位模拟器将其解释为 -9223372036854775808 。
现在我记得我的计算机架构101,他们曾经告诉过我们 - 32位= 更小的范围,64位= 更宽的范围。但显然,在64位模拟器上对正无穷大的解释存在溢出(因为我的研究告诉我正无穷大很可能是正数字)。
问题是 - 这是一个功能(如果是,那么为什么?),或者一个错误?
答案 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。