Почему toHexString имеет переменную длину? - PullRequest
0 голосов
/ 14 октября 2018

Почему toHexString печатает разные строки в очень специфических обстоятельствах?Печать числа ниже 0x80000000 работает просто отлично.Добавляя 1 к этому значению и печатая, он работает нормально.Но непосредственное присвоение этого значения не печатает одно и то же, вместо этого я должен добавить в конец букву L.

Я предполагаю, что это связано с тем фактом, что числовые литералы имеют тип int по умолчанию,но я не знаю, что это происходит в 0x80000000, а не при пересечении, например, 0xffffffff.

long a = 0x7FFFFFFF;
System.out.println(java.lang.Long.toHexString(a)); // prints 7fffffff

a++;
System.out.println(java.lang.Long.toHexString(a)); // prints 80000000


long b = 0x80000000;
System.out.println(java.lang.Long.toHexString(b)); // prints ffffffff80000000

b=0x80000000L;
system.out.println(java.lang.Long.toHexString(b)); // prints 80000000

PS Почему oracle или tutorialspoint ничего не говорято том, как методы реализованы?Где я могу найти реализацию стандартных библиотек?

1 Ответ

0 голосов
/ 14 октября 2018

Это не имеет ничего общего с методом toHexString, это все о int против long в Java и двоичном представлении целых чисел со знаком.

Когда вы пишете

long b = 0x7FFFFFFF;

и

long b = 0x80000000;

буквенное число справа интерпретируется как int (32 бита).Теперь, во втором случае это значение выходит за пределы положительного диапазона (со знаком) целого числа, его двоичное представление имеет 1 в крайнем левом положении, и, следовательно, число понимается как отрицательное (-2147483648).После этого в присваивании он переводится в (отрицательный) длинный, поэтому дополнительные 32 бита заполняются единицами.Вот почему вы видите эти «дополнительные» FFF...

Если вы не знаете о двоичном представлении целых чисел со знаком в Java, читайте здесь

...