2011-06-13 10 views

Respuesta

32

Cada expresión en allí se está evaluando (en tiempo de compilación, por supuesto, es una constante) como int * int en lugar de long * long. El resultado se desborda en algún punto. Así que sólo tiene que utilizar L para que todos los literales de operando larga:

interval = ((60000L * 60L) * 24L) * 30L; 

Por supuesto que podría salirse con la única haciendo algunos de los operandos anhela, pero tiendo a encontrar que es más fácil simplemente cambiar todo.

Una vez dicho todo esto, si usted está buscando "30 días por valor de milisegundos" sería mejor utilizar:

long interval = TimeUnit.DAYS.toMillis(30); 
2

Debido a que el valor de la ecuación está causando un número tan grande que se envuelve alrededor de resultado será un entero. Int

3

probar esto, no va a ser negativo:

long interval = 0; 

interval = ((60000L * 60L) * 24L) * 30L; 
+0

¿por qué 'interval = 0;'? –

+0

@Prashant Bhate - acaba de copiar el código de OP :) 'interval = 0;' no es necesario en absoluto. – adarshr

2

Su valor es 2592000000 que es mayor que el valor entero máximo con signo 2^31 (2147483648). Esto se conoce como desbordamiento de enteros, el resultado se desborda en negativo.

Cuestiones relacionadas