Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

1000 * 60 * 60 * 24 * 30 results in a negative number [duplicate]

I'm attempting to calculate 30 days by multiplying milliseconds however the result continually ends up being a negative number for the value of days_30 and I'm not sure why.

Any suggestions are greatly appreciated!

CODE SNIPPET:

// check to ensure proper time has elapsed
                SharedPreferences pref = getApplicationContext()
                        .getSharedPreferences("DataCountService", 0);
                 long days_30 = 1000 * 60 * 60 * 24 * 30;
                 long oldTime = pref.getLong("smstimestamp", 0);
                long newTime = System.currentTimeMillis();
                 if(newTime - oldTime >= days_30){

days_30 value results in: -1702967296

P.S.

 double days_30 = 1000 * 60 * 60 * 24 * 30;
                 double oldTime = pref.getLong("smstimestamp", 0);
                double newTime = System.currentTimeMillis();
                 if(newTime - oldTime >= days_30){

Results in a smaller - but still negative number. -1.702967296E9

like image 518
NoobDev954 Avatar asked Jun 20 '13 18:06

NoobDev954


3 Answers

You are multiplying ints together, and overflow occurs because the maximum integer is 2^31 - 1. Only after the multiplications does it get converted to a long. Cast the first number as a long.

long days_30 = (long) 1000 * 60 * 60 * 24 * 30;

or use a long literal:

long days_30 = 1000L * 60 * 60 * 24 * 30;

That will force long math operations from the start.

like image 99
rgettman Avatar answered Nov 19 '22 11:11

rgettman


   long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;
like image 39
ZhongYu Avatar answered Nov 19 '22 13:11

ZhongYu


Just change your multiplication to long days_30 = 1000L * 60 * 60 * 24 * 30;

like image 1
Guillaume Darmont Avatar answered Nov 19 '22 11:11

Guillaume Darmont