2012-12-12 16 views
1

什么是NSNumber允许的最高int值?我在这些论坛的其他地方看到了答案,因此我在这里深感困惑。NSNumber限制?

int miles = 35000; 
vehicle.mileage = [NSNumber numberWithInt:miles]; 
NSLog(@"int value = %d", miles); 
NSLog(@"mileage = %@", vehicle.mileage); 

输出是:

int value = 35000 
mileage = -30536 

我必须在这里失去了一些可怕的容易,但为什么这不能正常工作可有人向我解释?

UPDATE: 进一步细算,vehicle.mileage是越来越正确设置为35000,但是当我通过的NSLog显示此(@ “%@”,vehicle.mileage)它被不正确地输出它。当它停止工作时,我还没有找到“魔法”的价值,因为到目前为止,它的价值高达30,000。

+3

如果您用'NSNumber * mileage = [NSNumber numberWithInt:miles]'替换'vehicle.mileage = [NSNumber numberWithInt:miles]',然后更改'NSLog(@“mileage =%@”,vehicle.mileage); '到'NSLog(@“mileage =%@”,里程数);'你会得到预期的结果:'里程= 35000',所以我期望问题是''里程'属性'车辆'。检查一下它的制定者是不是在做一些有趣的事情。它绝对是'NSNumber'类型吗? – sjs

+0

它看起来正确。 – Minthos

+0

是的,它肯定是NSNumber类型 - @property(nonatomic,retain)NSNumber * mileage; – kschins

回答

3

NSNumber仅仅是一个包装,所以当包装的原始类型进入溢出时它会溢出。
所以如果你使用numberWithInt允许的最大数量为INT_MAX(limits.h中定义),如果使用numberWithFloat允许的最大数量为FLOAT_MAX,等等。
所以在这种情况下,你不会溢出,我怀疑INT_MAX会如此之低。

0

+numberWithInt:将该值解释为signed int。里程永远不会是负面的,所以我建议使用[NSNumber numberWithUnsignedInt:]

0

整数可以具有的极限NSNumber被称为INT_MAX但35,000远不及此。这个问题必须与vehicle对象或vehiclemileage属性其中之一可以是nil

因此,继续前进,记录与此条件语句:

if (!vehicle) { 
NSLog(@"Vehicle is nil"); 
} 
else if (!vehicle.mileage) { 
NSLog(@"Vehicle's mileage is nil"); 
} 

告诉我你的结果

+0

也不是零。看到我上面的更新。 – kschins

1

概述

NSNumber的是NSVA的子类提供与任何C标量 (数字)类型相同的值。它定义了一组专门用于设置 并将值作为有符号或无符号字符,short int,int, long int,long long int,float或double或作为BOOL访问的一组方法。 (请注意, 数字对象不一定保留它们创建的类型 。)它还定义了一个compare:方法来确定两个NSNumber对象的排序。

所以NSNumber是一样大它包装。对于您意想不到的结果,您可以从@sjs检查您的问题的评论。