Тип long
был 64-битным с момента выхода первой версии java 25+ лет назад go. То же самое и для Date: он всегда использовал 64-битное значение для подсчета миллисекунд, начиная с эпохи Unix 1 января 1970 года. Целевая архитектура JVM (32/64 бит) здесь не играет роли.
Ваш новый инструмент качества кода предупреждает, что объединение типов int и long в битовой арифметике c может иметь неожиданные результаты. Я предполагаю, что он предпочел бы, чтобы вы написали код как:
final long offset = (bytes.length - i - 1L) * 8L;
bytes[i] = (byte) (((value & (0xffL << offset)) >>> offset));
Я обеспокоен тем, что этот код использует только младшие 4 байта значения даты long
. Если вы используете миллисекундные метки времени, вы теряете информацию при этом преобразовании. Например, текущая метка времени (в шестнадцатеричном формате) - 17342e07b15
, и вы отправляете 42e07b15
в качестве вывода.