Java Primitives range calculation

JavaInteger Arithmetic

Java Problem Overview


In Java when we declare

short number=1024*1024*1024; 

it will give compile time error but

short number=1024 * 1024 * 1024 * 1024;

compiles fine. Why does this happen?

Java Solutions


Solution 1 - Java

The compiler will, in this case, evaluate the calculation (because it contains only constants) and try to assign the result to the variable. This calculation is done with type int and only converted to short on assignment, if at all possible.

In your case, the first calculation is too large to fit into a short (1073741824). The second one will overflow the int and end up in a range that short supports (0). So the assignment works in that case.

Mind you, you probably don't ever want to rely on these things in code.

Solution 2 - Java

You are facing the problem as your number is wrapping around.In the first case it does not wrap around and hence it overflows the range of short. But in the second case it wraps around after the calculationa and hence it comes in the range of short and so you dont have the compile time error.

A loss of precision means that you are losing information of the given value.(The short data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive).) In your first case the range of short is crossed(1073741824) and hence you are loosing the information.

> A narrowing conversion of a signed integer to an integral type T > simply discards all but the n lowest order bits, where n is the number > of bits used to represent type T.

EDIT:-

From JLS §3.10.1(very correctly mentioned in this similar question)

> It is a compile-time error if a decimal literal of type int is larger > than 2147483648 (231), or if the decimal literal 2147483648 appears > anywhere other than as the operand of the unary minus operator > (§15.15.4).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJekin KalariyaView Question on Stackoverflow
Solution 1 - JavaJoeyView Answer on Stackoverflow
Solution 2 - JavaRahul TripathiView Answer on Stackoverflow