NSNumber限制?

时间:2012-12-12 00:55:18

标签: objective-c ios

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

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

输出结果为:

int value = 35000
mileage = -30536

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

更新 进一步查看后,vehicle.mileage正确设置为35000,但是当我通过NSLog(@“%@”,vehicle.mileage)显示时,它输出错误。当它停止工作时,我还没有找到“魔法”值,因为截至目前,它适用于高达~30,000的值。

4 个答案:

答案 0 :(得分:3)

NSNumber只是一个包装器,因此当包装的基元类型溢出时它会溢出 因此,如果使用 numberWithInt ,则允许的最大数量为INT_MAX(在limits.h中定义),如果使用 numberWithFloat ,则允许的最大数量为FLOAT_MAX,依此类推。登记/> 所以在这种情况下你不会溢出,我怀疑INT_MAX会如此低。

答案 1 :(得分:1)

  

<强>概述

     

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

所以NSNumber和它所包含的一样大。对于您意想不到的结果,您可以查看@sjs的评论。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

限制NSNumber整数可以称为INT_MAX,但35,000与此无关。问题必须与vehicle对象或mileage中的vehicle属性相关,其中任何一个都可能是nil

因此,请继续使用此条件语句进行记录:

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

告诉我你的结果