Estoy trabajando con tipos de datos en este momento en Java, y si lo he entendido correctamente, el tipo longacepta un valor entre los rangos de -9,223,372,036,854,775,808 a +9,223,372,036,854,775,807. Ahora, como puede ver a continuación, he creado una longvariable llamada testLong, aunque cuando inserto 9223372036854775807 como valor, aparece un error que indica:
El literal 9223372036854775807 del tipo int está fuera de rango.
No sé por qué se refiere al longtipo de datos como int.
¿Alguien tiene alguna idea?
Código:
char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
java
int
long-integer
Mathew Donnan
fuente
fuente

Respuestas:
Agregue una mayúscula
Lal final:long value = 9223372036854775807L;De lo contrario, el compilador intentará analizar el literal como un
int, de ahí el mensaje de errorfuente
8o9. Quite los ceros iniciales.No lo es. Debe aprender a confiar en los mensajes del compilador (especialmente cuando son de compiladores sanos y modernos y no de compiladores antiguos de C / C ++). Si bien el idioma que hablan puede ser difícil de descifrar en ocasiones, generalmente no te están mintiendo.
Veámoslo de nuevo:
Tenga en cuenta que no menciona su variable
testLongo el tipo enlongninguna parte, por lo que no se trata de la inicialización. El problema parece ocurrir en algún otro momento.Ahora investiguemos algunas de las partes del mensaje:
intnos dice que quiere tratar algo como unintvalor (¡que no es lo que querías!)int)Dejaré la acogedora lista para hablar de literales por un momento: los literales son lugares donde tienes algún valor en tu código. Hay
Stringliterales, literales,intliterales,classetc. Cada vez que mencionas un valor explícitamente en tu código, es literal.Así que no te está molestando por la declaración de la variable, sino por el número en sí, el valor es lo que te molesta.
Puede verificar esto fácilmente utilizando el mismo literal en un contexto donde un
longy anintson igualmente aceptables:System.out.println(9223372036854775807);PrintStream.printlnpuede tomar cualquiera unainto unalong(o casi cualquier otra cosa). Entonces ese código debería estar bien, ¿verdad?No. Bueno, tal vez debería serlo, pero según las reglas no está bien.
El problema es que "algunos dígitos" se define como un
intliteral y, por lo tanto, debe estar en el rango definido porint.Si desea escribir un
longliteral, debe hacerlo explícito agregando laL(o minúsculal, pero altamente sugeriría que siempre utilice la variante en mayúsculas, porque es mucho más fácil de leer y más difícil de error para una1).Tenga en cuenta que ocurre un problema similar con
float(postfixF/f) ydouble(postfixD/d).Nota al margen: se dará cuenta de que no hay
byteoshortliterales y aún puede asignar valores (generalmenteintliterales) abyteyshortvariables: eso es posible debido a las reglas especiales en § 5.2 sobre Assignment Converson : permiten la asignación de expresiones constantes de un tipo más grande abyte,short,charointsi los valores están dentro del rango de los tipos.fuente
Intenta hacerlo
9223372036854775807L. ElLal final le dice a Java que9223372036854775807es unlong.fuente
Tuve este problema en el pasado y lo solucioné escribiendo el valor en forma científica. por ejemplo:
double val = 9e300;fuente
long ak = 34778754226788444L/l;Ambos usan, pero a la vez solo uno usa L mayúscula o l minúscula.
¿Por qué usar L / l? Porque long es parte del tipo de datos integral.
fuente