Шестнадцатиричное число "FBD626CC4961A4FC"
, преобразованное в десятичное значение, равно точно 18146734407382312188
. Это число действительно больше, чем максимально возможное long
, определяется как Long.MAX_VALUE
и которая равна 2 -1, или 9223372036854775807
:
System.out.println(new BigInteger("FBD626CC4961A4FC", 16)); // 18146734407382312188
System.out.println(Long.MAX_VALUE); // 9223372036854775807
Таким образом, это нормально, что вы получите обратно отрицательное число.
Вы не исключение, так как это именно цель этих новых *Unsigned*
методов, добавленных в Java 8, чтобы дать возможность обрабатывать неподписанных лонги (как compareUnsigned
или divideUnsigned
). Так как тип long
в Java is still unsigned, эти методы работают, понимая отрицательные значения как значения, превышающие MAX_VALUE
: он имитирует беззнаковый длинный. parseUnsignedLong
говорит:
Целое число без знака отображает значения, как правило, связанные с отрицательными числами до положительных чисел больше, чем MAX_VALUE
.
При печати long
, который был результатом parseUnsignedLong
, и он отрицательный, все это означает, что значение больше чем максимальное длинное значение, как определено в языке, но методы принятия неподписанные лонги как параметр будет правильно интерпретировать эти значения, как если бы они были больше максимального значения. Таким образом, вместо того, чтобы печатать его напрямую, если вы передадите этот номер toUnsignedString
, вы получите правильный вывод, like shown in this other answer. Не все эти методы новы для Java 8, например, toHexString
также интерпретирует данный long
как unsigned long в базе 16, а печать Long.toHexString(Long.parseUnsignedLong("FBD626CC4961A4FC", 16))
вернет вам правую шестнадцатеричную строку.
parseUnsignedLong
сгенерирует исключение только тогда, когда значение не может быть представлено как беззнаковое долго, то есть не ряд вообще, или больше, чем 2 -1 (а не 2 -1, который является максимальным значение для подписанного долго).
Печать 'Long.MAX_VALUE' и сравнить. Да, он слишком велик, чтобы вписаться в «длинный». – Tunaki
так что это не исключение? –
[Документация] (https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#parseUnsignedLong-java.lang.String-int-) утверждает, что он должен бросить ' NumberFormatException' if "Значение, представленное строкой, больше, чем наибольшее значение unsigned long, 2^64-1." Извините, но у меня нет ответа. – tsm