Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will a long % int will always fit into an int

Tags:

java

Can anyone confirm if this is true?

Java will turn a long % int into a long value. However it can never be greater than the modulus to it is always safe to cast it to an int.

long a = 
int b =
int c = (int) (a % b); // cast is always safe.

Similarly a long % short will always be safe to cast to a short.

If true, does any one know why Java has a longer type for % than needed?

Additionally, there is a similar case for long & int (if you ignore sign extension)

like image 759
Peter Lawrey Avatar asked Aug 31 '11 19:08

Peter Lawrey


1 Answers

For most (if not all) arithmetic operations, Java will assume you want the maximum defined precision. Imagine if you did this:

long a = ...;
int b = ...;

long c = a % b + Integer.MAX_VALUE;

If Java automatically down-casted a % b to an int, then the above code would cause an int overflow rather than setting c to a perfectly reasonable long value.

This is the same reason that performing operations with a double and an int will produce a double. It's much safer to up-cast the least-accurate value to a more accurate one. Then if the programmer knows more than the compiler and wants to down-cast, he can do it explicitly.

Update

Also, after thinking more about this, I'm guessing most CPU architectures don't have operations that combine 32-bit and 64-bit values. So the 32-bit value would need to be promoted to a 64-bit value just to use it as an argument to the CPU's mod operation, and the result of that operation would be a 64-bit value natively. A down-cast to an int would add an operation, which has performance implications. Combining that fact with the idea that you might actually want to keep a long value for other operations (as I mention above), it really wouldn't make sense to force the result into an int unless the developer explicitly wants it to be one.

like image 142
StriplingWarrior Avatar answered Sep 20 '22 15:09

StriplingWarrior