programming forums Java Java JSRs Mobile Certification Databases Caching Books Engineering Languages Frameworks Products This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
Sheriffs:
Saloon Keepers:
Bartenders:

# Question to Authors : What would the output be?

Ramaswamy Srinivasan
Ranch Hand
Posts: 295
Hi Authors,

Please clarify regarding the code snippet below.

Also, the reason was expected. Can you please help me out, in this regard?

Cheers,
Ram

Ernest Friedman-Hill
author and iconoclast
Sheriff
Posts: 24217
38
Because the constants on the right-hand-sides of these assignments are integers, not longs, the multiplication is done with integers, and the final int result is then converted to a long. "a" is less than the maximum value of an int by about a factor of 25, but "b" is way over, so "b" overflows and you end up with an unexpected value -- i.e., you get (int) (24*60*60*1000*1000L), which, just by happenstance, is about 5 times as large as "a", rather than 1000 times.

If you change the declaration of "b" to be

public static final long b =24*60*60*1000*1000L;

(note that "L" on the end) then the multiplies are done using longs, and you'll get the answer you expect.

Joshua Bloch
Author and "Sun God"
Ranch Hand
Posts: 124
Ernest,

Yep. We discuss this one in detail in Puzzle 3 ("Long Division"). Note that a better fix is:

By making the first factor in the sequence of multiplications a long, we don't have to worry about where the overflow occurs: the entire computation is done using longs.

Regards,

Josh and Neal

Originally posted by Ernest Friedman-Hill:
Because the constants on the right-hand-sides of these assignments are integers, not longs, the multiplication is done with integers, and the final int result is then converted to a long. "a" is less than the maximum value of an int by about a factor of 25, but "b" is way over, so "b" overflows and you end up with an unexpected value -- i.e., you get (int) (24*60*60*1000*1000L), which, just by happenstance, is about 5 times as large as "a", rather than 1000 times.

If you change the declaration of "b" to be

public static final long b =24*60*60*1000*1000L;

(note that "L" on the end) then the multiplies are done using longs, and you'll get the answer you expect.

Ramaswamy Srinivasan
Ranch Hand
Posts: 295
Hi Ernets, Josh and Neal

Thanks a lot for the explanation. This is making things lucid.

Thanks Again

Cheers,
Ram.

Joshua Bloch
Author and "Sun God"
Ranch Hand
Posts: 124
Ram,

Happy to help; that's what we're here for.

Josh

 It is sorta covered in the JavaRanch Style Guide.