Uzun veri türünden neden int olarak bahsettiğini bilmiyorum
O değil. Derleyici mesajlarına güvenmeyi öğrenmelisiniz (özellikle aklı başında, modern derleyicilerden geldiklerinde ve eski C / C ++ derleyicilerinden değillerse). Bazen konuştukları dili deşifre etmek zor olsa da, genellikle size yalan söylemezler.
Tekrar bakalım:
İnt 9223372036854775807'nin değişmez değeri aralık dışı.
O Not gelmez Değişkeninizi söz testLong
veya yazın long
o yüzden, hiçbir yerinde değil başlatma hakkında. Sorun başka bir noktada ortaya çıkıyor gibi görünüyor.
Şimdi mesajın bazı kısımlarını inceleyelim:
int
bize bir şeye bir int
değer olarak muamele etmek istediğini söyler (ki bu sizin istediğiniz şey değildir!)
- "aralık dışı" oldukça açık: bir şey beklenen aralıkta değil (muhtemelen aralığı
int
)
- "Birebir": şimdi ilginç olan: gerçek nedir?
Bir an için değişmezler hakkında konuşmak için rahat listeden çıkacağım: değişmezler, kodunuzda bir miktar değerin olduğu yerlerdir. String
Değişmezler, int
değişmezler, class
değişmezler vb. Vardır . Kodunuzda açıkça bir değerden her bahsettiğinizde , bu gerçek bir değerdir .
Yani aslında değişken bildirimi konusunda sizi rahatsız etmiyor, ama sayının kendisi, değer sizi rahatsız eden şey.
Bunu, a long
ve int
an'nin eşit derecede kabul edilebilir olduğu bir bağlamda aynı değişmezi kullanarak kolayca doğrulayabilirsiniz :
System.out.println(9223372036854775807);
PrintStream.println
ya birint
ya da along
(ya da hemen hemen her şeyi) alabilir. Öyleyse bu kod iyi olmalı, değil mi?
Eh sayılı, belki de gerektiği olabilir, ama kurallara göre o olduğunu iyi değil.
Sorun, "bazı rakamların" int
değişmez olarak tanımlanması ve bu nedenle tarafından tanımlanan aralıkta olması gerektiğidir int
.
Bir long
harfi harfine yazmak istiyorsanız , bunu L
(veya küçük harf ekleyerek açıklığa kavuşturmalısınız l
, ancak her zaman büyük harfli varyantı kullanmanızı şiddetle tavsiye ederim, çünkü okumak çok daha kolay ve a 1
) için hata yapmak daha zordur .
float
(Postfix F
/ f
) ve double
(postfix D
/ d
) ile benzer bir sorunun oluştuğunu unutmayın .
Yan not: hayır olduğunu fark edeceksiniz byte
ya short
değişmezleri ve hala atama değerleri (genellikle olabilir int
için değişmezleri) byte
ve short
değişkenleri: özel kurallara bağlı mümkündür Atama converson hakkında § 5.2 : izin verirler daha büyük bir tip sürekli ifadelerin atama için byte
, short
, char
ya da int
eğer tipleri aralığı içinde değerlerdir.