Как долго работать на Java?

Этот вопрос не о том, как длинный должен быть правильно добавлен в int, а скорее, что происходит, когда мы неправильно приводим его в 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

Вопрос в том, , как - это длинное значение, которое преобразуется в int?

Ответ 1

Низкие 32 бита long берутся и помещаются в int.

Здесь математика, хотя:

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