2011-01-11 1 views
7

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

Почему Java считает, что это неверно long.

@Test 
public void testOffendingBinaryString() { 
    String offendingString = "1000000000000000000010101000000000000000000000000000000000000000"; 
    assertEquals(64, offendingString.length()); 
    Long.parseLong(offendingString, 2); 
} 
+0

Как Java обидел? Возникли ли какие-либо исключения? – trojanfoe

+0

Java не испытывает никаких чувств ;-) –

+1

@Joachim Sauer нет чувств? Тогда почему Java Swings? – Nishant

ответ

5

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

"-111111111111111111101011000000000000000000000000000000000000000" 

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

0

Java удлинённый:

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

0

Размер строки слишком долго, проверьте это question

0

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

+0

Дополнение для двоих - это не то же самое, что «одна цифра для знака», потому что если бы это было так, то был бы положительный и отрицательный ноль. –

+0

Я не писал, что это знаковый бит, только для того, чтобы различать положительные и отрицательные числа. На мой взгляд, нет необходимости объяснять, как работает дополнение «Два» в ответе. – Reboot

1

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

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

Смежные вопросы