Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does long to int cast work in Java?

Tags:

java

casting

This question is not about how a long should be correctly cast to an int, but rather what happens when we incorrectly cast it to an int.

So consider this code -

   @Test     public void longTest()     {         long longNumber = Long.MAX_VALUE;         int intNumber = (int)longNumber; // potentially unsafe cast.         System.out.println("longNumber = "+longNumber);         System.out.println("intNumber = "+intNumber);     } 

This gives the output -

longNumber = 9223372036854775807 intNumber = -1 

Now suppose I make the following change-

long longNumber = Long.MAX_VALUE - 50; 

I then get the output -

longNumber = 9223372036854775757 intNumber = -51 

The question is, how is the long's value being converted to an int?

like image 757
CodeBlue Avatar asked Sep 19 '12 19:09

CodeBlue


People also ask

Can we type cast long to int in Java?

We can convert long to int in java using typecasting. To convert higher data type into lower, we need to perform typecasting. Typecasting in java is performed through typecast operator (datatype).

Can long be type casted to int?

Long is a larger data type than int, we need to explicitly perform typecasting for the conversion. Typecasting is performed through the typecast operator. There are basically three methods to convert long to int: By type-casting.

How does int cast work in Java?

In Java when you cast you are changing the “shape” (or type) of the variable. The casting operators (int) and (double) are used right next to a number or variable to create a temporary value converted to a different data type. For example, (double) 1/3 will give a double result instead of an int one.

Does int casting round up or down Java?

The cast rounds it "down" toward zero, while Math. floor rounds towards negative infinity.


1 Answers

The low 32 bits of the long are taken and put into the int.

Here's the math, though:

  1. Treat negative long values as 2^64 plus that value. So -1 is treated as 2^64 - 1. (This is the unsigned 64-bit value, and it's how the value is actually represented in binary.)
  2. Take the result and mod by 2^32. (This is the unsigned 32-bit value.)
  3. If the result is >= 2^31, subtract 2^32. (This is the signed 32-bit value, the Java int.)
like image 51
Louis Wasserman Avatar answered Oct 17 '22 07:10

Louis Wasserman