Estou trabalhando com tipos de dados no momento em Java e, se entendi corretamente, o tipo long
aceita um valor entre os intervalos de -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807. Agora, como você pode ver abaixo, criei uma long
variável chamada testLong
, embora quando eu insiro 9223372036854775807 como o valor, receba um erro informando:
O literal 9223372036854775807 do tipo int está fora do intervalo.
Não sei por que está se referindo ao long
tipo de dados como um int
.
Alguém tem alguma ideia?
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
fonte
fonte
Respostas:
Adicione uma maiúscula
L
ao final:Caso contrário, o compilador tentará analisar o literal como um
int
, daí a mensagem de errofonte
8
ou9
. Remova os zeros à esquerda.Não é. Você deve aprender a confiar nas mensagens do compilador (especialmente quando são de compiladores sãos e modernos, e não de compiladores C / C ++ antigos). Embora a linguagem que eles falam possa ser difícil de decifrar às vezes, eles geralmente não estão mentindo para você.
Vamos olhar de novo:
Observe que ele não menciona sua variável
testLong
ou o tipo emlong
lugar nenhum, portanto, não é sobre a inicialização. O problema parece ocorrer em algum outro ponto.Agora vamos investigar algumas das partes da mensagem:
int
nos diz que deseja tratar algo como umint
valor (que não é o que você queria!)int
)Vou deixar a lista aconchegante para falar sobre literais por um momento: literais são lugares onde você tem algum valor em seu código. Existem
String
literais,int
literais,class
literais e assim por diante. Cada vez que você menciona um valor explicitamente em seu código, é um literal.Portanto, não está realmente incomodando você sobre a declaração da variável, mas o próprio número, o valor é o que está incomodando você.
Você pode verificar isso facilmente usando o mesmo literal em um contexto onde a
long
e anint
são igualmente aceitáveis:PrintStream.println
pode levar umint
ou umlong
(ou praticamente qualquer outra coisa). Então esse código deve estar bem, certo?Não. Bem, talvez devesse ser, mas de acordo com as regras não está bem.
O problema é que "alguns dígitos" são definidos como
int
literais e, portanto, devem estar no intervalo definido porint
.Se você quer escrever um
long
literal, então você deve fazer que explícita, acrescentando oL
(caso ou menorl
, mas eu altamente sugiro que você use sempre a variante maiúsculas, porque é muito mais fácil de ler e mais difícil de erro para um1
).Observe que um problema semelhante ocorre com
float
(postfixF
/f
) edouble
(postfixD
/d
).Nota lateral: você perceberá que não há
byte
oushort
literais e ainda pode atribuir valores (geralmenteint
literais) a variáveisbyte
eshort
: isso é possível devido a regras especiais no § 5.2 sobre Assignment Converson : eles permitem a atribuição de expressões constantes de um tipo maior abyte
,short
,char
ouint
, se os valores estão dentro dos tipos variam.fonte
Tente fazer
9223372036854775807L
. OL
no final informa ao Java que9223372036854775807
é umlong
.fonte
Eu tive esse problema no passado e resolvi isso escrevendo o valor na forma científica. por exemplo:
fonte
Ambos usam, mas por vez, apenas um usa L maiúsculo ou l minúsculo.
Por que usar L / l? Porque long faz parte do tipo de dados integral.
fonte