İnt türündeki değişmez xyz aralık dışında


93

Şu anda Java'da veri türleriyle çalışıyorum ve doğru anladıysam tür long, -9,223,372,036,854,775,808 ile +9,223,372,036,854,775,807 aralığında bir değer kabul eder. Şimdi aşağıda görebileceğiniz gibi, longadında bir değişken oluşturdum testLong, ancak 9223372036854775807'yi değer olarak eklediğimde şunu belirten bir hata alıyorum:

İnt türünün değişmez değeri 9223372036854775807 aralık dışında.

longVeri türüne neden bir int.

Herhangi bir fikri olan var mı?

Kod:

char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;

Bu arada: hangi derleyiciyi kullanıyorsunuz? Hem Eclipse hem de Sun JDK derleyicisi, bu sorun için farklı (bence daha iyi) hata mesajları veriyor.
Joachim Sauer

Yanıtlar:


200

LSonuna bir sermaye ekleyin :

long value = 9223372036854775807L;

Aksi takdirde, derleyici hazır bilgiyi bir olarak ayrıştırmaya çalışır int, dolayısıyla hata mesajı


4
Java dil özelliklerinde. Metnin tamamını burada bulabilirsiniz
Lukas Eder

@Lukas, uzun değer = 00000077029062100L; bana aynı hatayı veriyor ve 19 haneden az. "Uzun tipin değişmez 0000007702062100L'si menzil dışında"
Brooklynn99

1
@SantosshKumhar: Bu bir var sekizlik düz , basamak içeremez olan 8ya da 9. Baştaki sıfırları kaldırın.
Lukas Eder

51

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 testLongveya yazın longo 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:

  • intbize bir şeye bir intdeğ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. StringDeğişmezler, intdeğişmezler, classdeğ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 longve intan'nin eşit derecede kabul edilebilir olduğu bir bağlamda aynı değişmezi kullanarak kolayca doğrulayabilirsiniz :

System.out.println(9223372036854775807);

PrintStream.printlnya 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" intdeğişmez olarak tanımlanması ve bu nedenle tarafından tanımlanan aralıkta olması gerektiğidir int.

Bir longharfi 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 byteya shortdeğişmezleri ve hala atama değerleri (genellikle olabilir intiçin değişmezleri) byteve shortdeğ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, charya da int eğer tipleri aralığı içinde değerlerdir.


3
Saati nereden alıyorsunuz ;-)
Lukas Eder

3
@Lukas: Bazen 300 tane daha kısa cevap yazmak zorunda kalmayacağım umuduyla böyle cevaplar yazıyorum ;-) Ayrıca: hata mesajını yorumlamaya yardımcı olmak (umarım) daha az "bu hata mesajı ne anlama geliyor" soruları anlamına gelir.
Joachim Sauer

Cevabınız çok iyi ... şüphesiz, bu yüzden oy verin, ama lütfen onu düzenleyin ve en üstte (cevabınızın başlangıcı), sorunun tam çözümünü 1 satıra ve ardından açıklamanızın altına yazın. Çünkü pek çok insan derin bir açıklama yerine hızlı çözüm
arıyor

4
Diğer ikinci cevaplara bakmakta özgürdürler (en yüksek oyu alan cevap bile hızlı çözümü verir). İnsanları hata mesajlarını nasıl ayrıştıracakları ve anlayacakları konusunda eğitmenin uzun vadede bunu onlar için yapmaktan daha yararlı olduğunu düşünüyorum. "Bir adama bir balık verin ..." falan.
Joachim Sauer

Yan not için teşekkürler.
Venkatesh Goud

19

Yapmayı dene 9223372036854775807L. LSonunda bu Java söyler 9223372036854775807bir olduğunu long.


0

Geçmişte bu sorunu yaşadım ve değeri bilimsel biçimde yazarak düzelttim. Örneğin:

double val = 9e300;

-2
long ak = 34778754226788444L/l;

Her ikisi de kullanır, ancak bir seferde yalnızca biri büyük L veya küçük l harfini kullanır.

Neden L / l kullanıyorsunuz? Çünkü uzun, integral veri türünün bir parçasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.