I recently ran into an overflow situation with Java's long data type while multiplying millisecond timestamps. Here is a crib sheet on dealing with large numbers.
Java does not throw a RuntimeException when overflow or underflow occurs but instead silently drops the high-order bits.
The epoch for programming is 1st January 1970. A timestamp returned by System.currentTimeMillis() represents the number of milliseconds that have elapsed since the epoch.
An example timestamp representing the current time (29th September 2011) is
1,317,041,017,000
The limit of a long primitive in Java is 64 bits (2 ^ 64)
2 ^ 64 is 18,446,744,073,709,551,616
Java long is a signed datatype so the largest possible positive value is 2 ^ 63 - 1 and can be conveniently accessed using the constant
Long.MAX_VALUE
Which is
9,223,372,036,854,775,807
Long.MAX_VALUE = 9.2E18
A current timestamp is
1.3E12
Therefore the maximum amount by which you can multiply a millisecond timestamp without overflow is
9.2E18 / 1.3E12 = approimately 7E6
This is approximately 116 seconds worth of milliseconds.
If you need to multiply bigger number than this then use a http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html