2011-01-11 48 views
7

Tengo el siguiente código:¿Por qué se ofende Java por el uso de Long.parseLong (String s, int radix) con este número binario largo?

¿Por qué Java cree que esto no es válido? long.

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

Cómo se ofende Java? ¿Alguna excepción planteada? – trojanfoe

+0

Java no tiene sentimientos ;-) –

+1

@Joachim Sauer no tiene sentimientos? Entonces, ¿cómo es que Java Swings? – Nishant

Respuesta

5

Porque está fuera de rango por el valor válido de un largo. La cadena:

"-111111111111111111101011000000000000000000000000000000000000000" 

debería funcionar bien. No puede especificar un número negativo directamente en 2s complement binary notation. Y si intentas especificar un número positivo, ese número es demasiado grande para caber en un Java long, que es un valor firmado de 64 bits expresado en complemento a 2s (lo que significa que es básicamente 63 bits + un bit de signo (es un un poco más complicado que eso, lea la página en complemento a 2)).

0

Java Tipo larga:

8 bytes firmados (complemento a dos). Varía desde -9,223,372,036,854,775,808 hasta +9,223,372,036,854,775,807.

0

El tamaño de la cadena es demasiado largo, marca esta question

0

internamente numeros se representan mediante la Two's complement. Eso significa que solo hay 63 bits, para que el número y un bit representen números positivos o negativos. Como Long.parseLong() no se utiliza para analizar números en Complemento dos, su Cadena es un número positivo con 64 bits, que excede el valor positivo máximo para long.

+0

El complemento de dos no es lo mismo que "un dígito para el signo", porque si lo fuera, habría un cero positivo y uno negativo. –

+0

No escribí que es un signo, solo que se usa para distinguir entre números positivos y negativos. Realmente no hay necesidad de explicar cómo funciona el complemento de Dos en la respuesta, en mi opinión. – Reboot

1

El long se almacena en el complemento 2, pero el método de análisis espera el binario directo. Por lo tanto, el número máximo de dígitos en el String puede ser 63.

Al usar un binario común, no hay un bit de signo. Puede pasarlo a String con longitud 63 y precederlo con - si quiere un long negativo.

Cuestiones relacionadas