Parece que quando você digita um número em Java, o compilador o lê automaticamente como um inteiro, e é por isso que quando você digita (longo) 6000000000
(não no intervalo de inteiros), ele reclama que 6000000000
não é um inteiro. Para corrigir isso, tive que especificar 6000000000L
. Acabei de aprender sobre esta especificação.
Existem outras especificações de número, como short, byte, float, double? Parece que seria bom ter isso porque (presumo) se você pudesse especificar o número que está digitando é um curto, então java não teria que lançá-lo - isso é uma suposição, me corrija se eu estiver errado . Eu normalmente pesquisaria essa questão sozinho, mas não sei como esse tipo de especificação de número é chamado.
1
coml
e0
comO
(e assim por diante), sua prioridade é definir a fonte correta (se puder ) e se preocupe em não perder a tecla Shift.long _lo = 30;
e não30L
, isso significa que minha variável será convertida em flutuante ? Ou, no caso_lo = _lo + 2.77
disso_lo
, será lançado em float, embora tenha sido declarado tão longo30
é umint
que é automaticamente convertido por meio de uma conversão de alargamento para umlong
. No segundo caso, sua declaração é ilegal. Você teria que lançar explicitamente o lado direito para longo, por exemplo_lo = (long) (_lo + 2.77)
l
e1
(0
eO
resp.) São bastante semelhantes.Espero que você não se importe com uma tangente ligeira, mas pensei que possa estar interessado em saber que, além de
F
(para float),D
(para duplo) eL
(por muito tempo), foi feita uma proposta para adicionar sufixos parabyte
eshort
-Y
eS
respectivamente . Isso eliminaria a necessidade de converter em bytes ao usar a sintaxe literal para matrizes de bytes (ou curtas). Citando o exemplo da proposta:Joe Darcy está supervisionando o Projeto Coin para Java 7 e seu blog tem sido uma maneira fácil de rastrear essas propostas.
fonte
0b
Entretanto , obtivemos _ em literais numéricos e o prefixo para literais binários. Grito.Por padrão, qualquer tipo de dado primitivo integral (byte, short, int, long) será tratado como tipo int pelo compilador java. Para byte e short , desde que o valor atribuído a eles esteja em seu intervalo, não há problema e nenhum sufixo é necessário. Se o valor atribuído a byte e short exceder seu intervalo, a conversão explícita de tipo será necessária.
Ex:
para superar este tipo de fundição.
No caso de tipo de dados longos, ele pode aceitar o valor inteiro sem qualquer problema. Suponha que atribuímos gosto
neste caso, nenhum sufixo como L / l é necessário. Por padrão, o valor 2147483647 é considerado pelo compilador java como tipo int. A conversão de tipo interno é feita pelo compilador e int é promovido automaticamente para tipo Longo.
Aqui, precisamos colocar o sufixo como L para tratar o literal 2147483648 como tipo longo do compilador java.
então finalmente
fonte
Esses são literais e são descritos na seção 3.10 das especificações da linguagem Java.
fonte
Como a análise de literais ocorre em tempo de compilação, isso é absolutamente irrelevante em relação ao desempenho. A única razão pela qual ter
short
ebyte
sufixos seria bom é que leva a um código mais compacto.fonte
Para entender por que é necessário distinguir entre
int
elong
literais, considere:versus
Agora, como você poderia esperar, ambos os fragmentos de código dão o mesmo valor à variável
l
. Sem ser capaz de distinguirint
elong
literais, qual é a interpretação de-1 >>> 1
?ou
Portanto, mesmo se o número estiver na faixa comum, precisamos especificar o tipo. Se o padrão mudasse com a magnitude do literal, haveria uma mudança estranha nas interpretações das expressões apenas com a mudança dos dígitos.
Isso não ocorre para
byte
,short
echar
porque eles estão sempre promovida antes de realizar operações aritméticas e bit a bit. Indiscutivelmente, deveriam ser sufixos de tipo inteiro para uso em, digamos, expressões de inicialização de array, mas não há.float
usa o sufixof
edouble
d
. Outros literais têm tipos não ambíguos, havendo um tipo especial paranull
.fonte
Integer.MAX_VALUE
, no entanto, se não havia nenhuma maneira de distinguir entreint
elong
literais seria ambíguo. / Não me lembro dessa pergunta, mas esclareci minha resposta de qualquer maneira.