Почему Long.toHexString (0xFFFFFFFF) возвращает ffffffffffffffff - PullRequest
4 голосов
/ 30 января 2012

Это то, что я вижу в Java, и это меня озадачивает.

Long.toHexString(0xFFFFFFFF) возвращает ffffffffffffffff

Аналогично, 0xFFFFFFFF и Long.parseLong("FFFFFFFF", 16) неравны.

Ответы [ 4 ]

9 голосов
/ 30 января 2012

Это:

Long.toHexString(0xFFFFFFFF)

эквивалентно:

Long.toHexString(-1)

, что эквивалентно:

Long.toHexString(0xFFFFFFFFFFFFFFFFL)

По сути, проблема в том, что вы указываете отрицательное значение int, которое затем преобразуется в эквивалентное отрицательное значение long , которое состоит из «всех F». Если вы действительно хотите 8 Fs, вы должны использовать:

Long.toHexString(0xFFFFFFFFL)
7 голосов
/ 30 января 2012

Как уже говорили другие, 0xFFFFFFFF оценивается как int значение -1, которое повышается до long.

Чтобы получить ожидаемый результат, квалифицируйтеськонстанта с суффиксом L, указывающая на то, что она должна рассматриваться как long, т.е. Long.toHexString(0xFFFFFFFFL).

2 голосов
/ 30 января 2012

Конечно, Long в Java имеет длину 64 бита! 0xFFFFFFFF означает -1 как int, когда записано в 64 битах, это ffffffffffffffff.

Однако, если число было без знака, строка также была бы ffffffff [но в java нет unsigned.

1 голос
/ 30 января 2012

0xFFFFFFFF является литералом int. При использовании int s (32 бита в Java) 0xFFFFFFFF равно -1. Что делает ваш код:

  • компилятор разбирает 0xFFFFFFFF как int со значением -1
  • среда выполнения java вызывает Long.toHexString(-1) (-1 автоматически «преобразуется» в long, что ожидается здесь)

А при использовании long с (64 бита в Java) -1 равно 0xffffffffffffffff.

long литералы постфиксируются L. Итак, ваше ожидаемое поведение записано в Java как:

Long.toHexString(0xFFFFFFFFL)

и Long.toHexString(0xFFFFFFFFL) - это "ffffffff"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...