2015-04-27 63 views
0

考虑这一段代码:爪哇长被错误地计算

  // calculate age of dog 
      long interval = 1000*60*60*24*30; 
      int ageInWeeks = Weeks.weeksBetween(geburtsDatumDateTime, nowDateTime).getWeeks(); 
      if (ageInWeeks < 20){ 
       // wöchentlich 
       interval = 1000*60*60*24*7; 
      } else if (ageInWeeks >= 20 && ageInWeeks < 52){ 
       // 2-wöchentlich 
       interval = 1000*60*60*24*14; 
      } else if (ageInWeeks >= 52){ 
       // monatlich 
       interval = 1000*60*60*24*30; 
      } 

调试器显示的是,在ageInWeeks> = 52的时间间隔的情况下是:-1702967296,但它应该是:25.92亿

减号表示某种溢出错误。 然而Java中long的最大值是2E63-1,它是:9.2233E18

我在这里错过了什么?是一个较长的较小的Android最大值?

+0

您可以用'Long.MAX_VALUE' –

回答

3

您正在计算32位signed int,计算溢出,然后您将结果分配给long。

通过使其中一个操作数变长,以64位进行计算。例如,添加L到一个操作数,使之成为长的文字:

interval = 1000L*60*60*24*30; 
+1

他不应该做的最左边的数字为'long'检查长的最大值,因为整数乘法可能溢出它得到了'30L'前? –

+0

在这种情况下并不重要,但通常这样做更有意义,谢谢。 – laalto

+0

@laalto完全如您所说。谢谢。 – mrd

0

正如laalto说,一个“L”应该使其工作。 然而,对于避免这些样的错误,在未来,你可以使用TIMEUNIT类(可在Android SDK中):

长间隔= TimeUnit.DAYS.toMillis(30);