Как убрать ведущий "f" при разборе Long с помощью toHexString - PullRequest
3 голосов
/ 21 апреля 2020

Я пишу модульные тесты для моего проекта, пытаясь проверить значение long в шестнадцатеричном формате, используя метод Long.toHexString(l).

Когда я проверяю, используя long равно 111, я получаю значение 6f, которое является правильным и, как я и ожидал.

Но когда long -64, я ожидаю c0, но вместо этого я получаю ffffffffffffffc0.

Из чтения Java Do c я вижу, что метод ожидает длинную без знака, и если ему передано отрицательное значение, то возвращается дополнение 2s. Но как это исправить?

Я написал небольшую программу для тестирования,

@Test
public void long_to_hex() {
   Long l = new Long(-64);
   //Long l = new Long(111);
   System.out.println(l.toHexString(l));
}

1 Ответ

3 голосов
/ 22 апреля 2020

Ваше утверждение «если передано отрицательное значение, а затем возвращается дополнение 2s» не соответствует документации :

Длинное значение без знака является аргументом плюс 2⁶⁴, если аргумент отрицательный; в противном случае он равен аргументу.

Таким образом, на самом деле все наоборот, значение, которое вы передаете, уже использует дополнение 2s, но возвращаемое значение является строкой, способной воспроизвести правое long биты, даже если они не интерпретируются как дополнение 2s. Другими словами, в вашем long значении установлены все старшие биты, следовательно, шестнадцатеричное представление имеет соответствующее количество ведущих f символов.

Альтернатива состоит в том, чтобы сохранить представление подписанным:

long l = -64;
System.out.println(Long.toHexString(l));
System.out.println(Long.toString(l, 16));
ffffffffffffffc0
-40
...