两个整数之和的值不正确

时间:2010-05-26 09:06:17

标签: iphone nsinteger

我确定我错过了一些东西,答案很简单,但我似乎无法理解为什么会这样。我正在尝试平均日期:

NSInteger runningSum =0;
NSInteger count=0;
for (EventoData *event in self.events) {
    NSDate *dateFromString = [[NSDate alloc] init];
    if (event.date != nil) {
        dateFromString = [dateFormatter dateFromString:event.date];
        runningSum += (NSInteger)[dateFromString timeIntervalSince1970];
        count += 1;
    }
}
if (count>0) {
    NSLog(@"average is: %@",[NSDate dateWithTimeIntervalSince1970:(NSInteger)((CGFloat)runningAverage/count)]);
}

除了runningSum + =(NSInteger)[dateFromString timeIntervalSince1970]之外,一切似乎都运行正常,但结果不正确。如果我在取两个相等日期的平均值时设置断点(例如,2009-10-10,即timeInterval为1255125600),则runningSum为-1784716096,而不是预期的2510251200。

我尝试过使用NSNumber,得到的结果相同。任何人都可以指出我正确的方向吗?

谢谢!

安东尼奥

3 个答案:

答案 0 :(得分:2)

你是否有某种理由想与NSInteger捏造?

[NSDate timeIntervalSince1970]返回一个NSTimeInterval,它基本上是一个double。清理代码,看看是否有帮助。

答案 1 :(得分:1)

NSInteger可以保存最大为INT_MAX限制的值,等于2147483647 - 因此您的值超出整数类型限制 - 请记住timeInterval是double类型。

您可以尝试在所有计算中使用double类型或使用-timeIntervalSinceReferenceDate方法 - 它返回自1 January 2001以来的间隔,您也可以避免溢出。

如果您的events对象是一个允许获取其大小的数组或其他类型,那么您可以添加已经除以计数的时间间隔值 - 这也可能有助于避免溢出:

NSTimeInterval runningSum = 0;
NSInteger count = [self.events count];
for (...){
...
runningSum += [dateFromString timeIntervalSince1970]/count;
}

答案 2 :(得分:0)

NSInteger是iPhone上的32位有符号整数,因此仅限于-2147483648和+2147483647之间的值。

您可以使用NSUInteger获得所需的结果,{{1}}是一个无符号的32位整数,可以包含0到+4294967295之间的值。

但是,您应该注意循环中的运行次数,这样就不会包含值。