Как долго работать на 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
.)