Estoy trabajando con tipos de datos en este momento en Java, y si lo he entendido correctamente, el tipo long
acepta 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 long
variable 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 long
tipo 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
L
al final:long value = 9223372036854775807L;
De lo contrario, el compilador intentará analizar el literal como un
int
, de ahí el mensaje de errorfuente
8
o9
. 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
testLong
o el tipo enlong
ninguna 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:
int
nos dice que quiere tratar algo como unint
valor (¡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
String
literales, literales,int
literales,class
etc. 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
long
y anint
son igualmente aceptables:System.out.println(9223372036854775807);
PrintStream.println
puede tomar cualquiera unaint
o 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
int
literal y, por lo tanto, debe estar en el rango definido porint
.Si desea escribir un
long
literal, 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
byte
oshort
literales y aún puede asignar valores (generalmenteint
literales) abyte
yshort
variables: 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
,char
oint
si los valores están dentro del rango de los tipos.fuente
Intenta hacerlo
9223372036854775807L
. ElL
al final le dice a Java que9223372036854775807
es 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