Почему Java оскорбляет мое использование Long.parseLong(String s, int radix) с этим длинным двоичным числом?

У меня есть следующий код:

Почему Java считает, что это не допустимый long.

@Test
public void testOffendingBinaryString() {
 String offendingString = "1000000000000000000010101000000000000000000000000000000000000000";
 assertEquals(64, offendingString.length());
 Long.parseLong(offendingString, 2);
}
6 ответов

Потому что это вне диапазона для действительного значения long. Строка:

"-111111111111111111101011000000000000000000000000000000000000000"

должен работать нормально. Вы не можете указать отрицательное число непосредственно в 2s дополнять двоичную нотацию. И если вы пытаетесь указать положительное число, это число слишком велико, чтобы вписаться в длинную Java, что является подписанным 64-битным значением, выраженным в дополнении 2s (что означает, что в основном это 63 бит + знаковый бит (это немного сложнее, прочитайте страницу на дополнении 2s)).


Это ошибка на Java, см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4215269, они исправили ее в 1,8


long хранится в 2 комплиментах, но метод разбора ожидает прямой двоичный файл. Таким образом, максимальное число цифр в String может быть 63.

При использовании обычного двоичного файла бита знака нет. Вы можете передать ему String длиной 63 и перед ним -, если вы хотите отрицательный long.


Внутренние числа представлены с помощью Два дополнения. Это означает, что есть только 63 бита, поскольку число и один бит представляют собой положительные или отрицательные числа. Поскольку Long.parseLong() не относится к номерам синтаксического анализа в двух дополнитях, ваша строка является положительным числом с 64 битами, что превышает максимальное положительное значение для long.


Java long type:

Записано 8 байт (два дополнения). Диапазоны от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807.


Размер строки слишком длинный, проверьте question

licensed under cc by-sa 3.0 with attribution.