Как долго работает int cast в Java?

Этот вопрос не о том, как long должен быть правильно приведен к int, а о том, что происходит, когда мы неверно приводим long к int.

Так что рассмотрите этот код -

   @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);
    }

Это дает вывод -

longNumber = 9223372036854775807
intNumber = -1

Теперь предположим, что я внес следующее изменение:

long longNumber = Long.MAX_VALUE - 50;

Затем я получаю вывод -

longNumber = 9223372036854775757
intNumber = -51

Вопрос в том, как значение long конвертируется в int?

1 ответ

Решение

Младшие 32 бита long взяты и помещены в int,

Вот математика, хотя:

  1. Относиться негативно long значения как 2^64 плюс это значение. Так -1 рассматривается как 2^64 - 1. (Это 64-разрядное значение без знака, и именно так оно и представляется в двоичном виде.)
  2. Возьми результат и мод на 2^32. (Это 32-разрядное значение без знака.)
  3. Если результат>= 2^31, вычтите 2^32. (Это 32-разрядное значение со знаком, Java int.)
Другие вопросы по тегам