This week's book giveaway is in the Servlets forum.
We're giving away four copies of Murach's Java Servlets and JSP and have Joel Murach on-line!
See this thread for details.
The moose likes Java in General and the fly likes Question to Authors : What would the output be? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Murach's Java Servlets and JSP this week in the Servlets forum!
JavaRanch » Java Forums » Java » Java in General
Bookmark "Question to Authors : What would the output be?" Watch "Question to Authors : What would the output be?" New topic
Author

Question to Authors : What would the output be?

Ramaswamy Srinivasan
Ranch Hand

Joined: Aug 31, 2004
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
Marshal

Joined: Jul 08, 2003
Posts: 24183
    
  34

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.


[Jess in Action][AskingGoodQuestions]
Joshua Bloch
Author and "Sun God"
Ranch Hand

Joined: May 30, 2001
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.


Joshua Bloch <br />Author of <a href="http://www.amazon.com/exec/obidos/ASIN/0201310058/ref=ase_electricporkchop" target="_blank" rel="nofollow">Effective Java</a> and coauthor of <a href="http://www.amazon.com/exec/obidos/ASIN/032133678X/ref=ase_electricporkchop" target="_blank" rel="nofollow">Java Puzzlers</a>
Ramaswamy Srinivasan
Ranch Hand

Joined: Aug 31, 2004
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

Joined: May 30, 2001
Posts: 124
Ram,

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

Josh
 
wood burning stoves
 
subject: Question to Authors : What would the output be?
 
Similar Threads
Working with Date and Time
How to get Yesterday's date
Regarding int operations out of range
Please explain the behavior
Incrementing and Decrementing Variables