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

자바 감정이 없다 ;-) –

+1

@ Joachim Sauer 감정이 없습니까? 그렇다면 Java Swing은 어떻게 생겨나나요? – Nishant

답변

5

유효한 값인 a의 범위를 벗어났습니다. 문자열 :

"-111111111111111111101011000000000000000000000000000000000000000" 

잘 작동합니다. 음수는 2s complement binary notation에 직접 지정할 수 없습니다. 양수를 지정하려고하면 그 수가 너무 커서 Java long에 맞지 않습니다. 부호있는 64 비트 값은 2의 보수로 표시됩니다 (기본적으로 63 비트 + 부호 비트를 의미합니다. 그보다 조금 더 복잡하고, 2s 보충에 대한 페이지를 읽으십시오)).

0

자바 long 타입 :

8 바이트 서명 (2의 보수). 범위는 -9,223,372,036854775808 부터 +9,223,372,036854775807까지입니다.

0

문자열의 크기가 너무 긴이 question

0

내부적으로 번호가 Two's complement을 사용하여 표시됩니다 확인하십시오. 즉, 숫자는 63 비트이고 양수 또는 음수는 1 비트입니다. Long.parseLong()은 2의 보수로 숫자를 구문 분석하지 않으므로 문자열은 64 비트의 양수이며 long의 최대 양수 값을 초과합니다.

+0

2의 보수는 "sign for sign"과 같지 않습니다. 왜냐하면 양수와 음수의 0이 있기 때문입니다. –

+0

나는 이것이 부호 비트라는 것을 쓰지 않았고 단지 양수와 음수를 구별하는 데 사용된다는 것입니다. 저의 의견으로는 Two 's complement가 어떻게 작동하는지 설명 할 필요가 없습니다. – Reboot

1

long은 2의 칭찬에 저장되지만 parse 메서드는 곧은 이진수를 예상합니다. 따라서 String의 최대 자릿수는 63 일 수 있습니다.

일반 이진을 사용하는 경우 부호 비트가 없습니다. 길이가 63 인 String을 전달하고 long을 원할 경우 - 앞에 넣을 수 있습니다.

관련 문제