Java'nın L numarası (uzun) belirtimi


96

Görünüşe göre Java'da bir sayı yazdığınızda, derleyici bunu otomatik olarak bir tamsayı olarak okur, bu yüzden (long) yazdığınızda 6000000000(tamsayı aralığında değil) tam sayı olmadığından şikayet eder 6000000000. Bunu düzeltmek için belirtmek zorundaydım 6000000000L. Bu özelliği yeni öğrendim.

Short, byte, float, double gibi başka sayı özellikleri var mı? Görünüşe göre bunlara sahip olmak iyi olacak çünkü (varsayıyorum) yazdığınız sayıyı kısa bir süre belirtebilseydiniz, java'nın bunu yayınlaması gerekmez - bu bir varsayım, yanılıyorsam düzeltin . Normalde bu soruyu kendim araştırırdım, ancak bu tür bir sayı spesifikasyonuna ne denildiğini bile bilmiyorum.

Yanıtlar:


178

long(Ör. 39832L), float(Ör. 2.4f) Ve double(ör -7.832d. ) İçin özel son ekler vardır .

Sonek yoksa ve bir integral tipiyse (örn. 5623), Bunun bir olduğu varsayılır int. İntegral bir tür değilse (örneğin 3.14159), a olduğu varsayılır double.

Diğer tüm durumlarda ( byte, short, charözel eki vardır gibi), döküm gerekir.

Java spec iki üst ve alt durumda ekleri sağlar fakat harf versiyonu longharf olarak s, tercih edilen Lbir sayı ile daha kolay şaşırtmak için 1küçük harflerle daha l.

Bkz JLS bölüm 3.10 kanlı detayları (tanımına bakınız için IntegerTypeSuffix).


9
Geç giriş: belirsizlik potansiyel kaynakları çıkarmadan her zaman iyidir ve Katılmıyor değilim ... ama kendini kafa karıştırıcı bulursam iman 1ile lve 0ile O(ve benzeri), sizin öncelikli (yazı tipi hakkı ayarlamaktır eğer yapabilirsen ), ardından Shift tuşunu kaçırmadığınızdan emin olun.
davidcesarino

Bir bildirirseniz ben ... son ekler hakkında bir sorum var @SimonNickerson uzun ya da çift : gibi değişken long _lo = 30;ve 30Lbu benim değişken çevrilecektir demek şamandıra ? Veya durumunda _lo = _lo + 2.77o _loiçine dökülmüştür edilecek şamandıra o kadar açıklanmasına karşın uzun
luigi7up

Hayır, burada şamandıralar dahil değildir. Birinci durumda, 30bir olduğunu intotomatik olarak bir genişletme dönüşüm yoluyla dönüştürülmüş olur ki long. İkinci durumda, ifadeniz yasa dışıdır. Sağ elinizi açıkça uzun _lo = (long) (_lo + 2.77)
tutmanız gerekir

4
@DavidCesarino yazı tipini değiştirmek sizin için belirsizliği düzeltir - doğru ayarladığınız belirli düzenleyicide. L'yi L'ye değiştirmek , kodu farklı bir Düzenleyicide, IDE'de okurken, web'deki kaynağa (inceleme araçları, depolar, vb.) Bakarken siz de dahil olmak üzere kodunuzu okuyabilecek herkes için belirsizliği düzeltir . IMHO'nun önceliği Shift tuşunu kaçırmamaktır. Btw. hangi yazı tipini önerirsiniz? Monospace'i seviyorum ve gördüğüm neredeyse tüm editörlerde, CLI'lerde vb. Ve bu fontta lve 1( 0ve Oyanıt) oldukça benzer.
dingalapadum

1
@dingalapadum Dediğim gibi haklısın. Belirsizlik kaynaklarını ortadan kaldırmak kesinlikle yapılacak doğru bir şeydir. Sadece kolayca hata yapabileceğiniz herhangi bir düzenleyici kullanmamalısınız dedim. Başka bir deyişle, eski savunmacı kodlama önerisi, ancak ona bağlı değil. Yazı tipi hakkında çok kişiseldir, ancak her zaman elimden geldiğince Deja Vu Sans Mono kullanırım çünkü 1) tek aralıklıdır; 2) karakterler arasında belirsizlikler yoktur; ve 3) Neredeyse iyi, okunabilir bir sans-serif yazı tipi gibi güzel ve zarif şekillerini seviyorum (diğer iyi programlama yazı tipleri fazlasıyla "metalik" IMHO hissi veriyor).
davidcesarino

13

Sana hafif bir teğet rica ediyoruz, ancak yanında sen olduğunu bilmek ilginizi çekebilir düşünce F(float için), D(çift için) ve L(uzun), bir öneri yapılmıştır için son ekleri eklemek byteve short- Yve Ssırasıyla . Bu, bayt (veya kısa) diziler için değişmez sözdizimi kullanıldığında baytlara dönüştürme ihtiyacını ortadan kaldırır. Tekliften örnek alıntılamak:

ÖNEMLİ YARAR: Teklif kabul edilirse platform neden daha iyi?

kaba kod gibi

 byte[] stuff = { 0x00, 0x7F, (byte)0x80,  (byte)0xFF};

olarak yeniden kodlanabilir

 byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };

Joe Darcy, Project Coin for Java 7'yi denetliyor ve blogu bu önerileri takip etmenin kolay bir yolu oldu.


bu güzel olurdu ... Her zaman tüm yayınların gerçekten sinir bozucu olduğunu
bulmuşumdur

Bunun Java 7'ye geçmediğini anladım. Gelecekteki bir güncellemeye mi yoksa Java 8'e mi dönüştüreceğine dair bir haber var mı?
ezmek

@crush Birkaç ay önce araştırmaya çalıştım ve söyleyebildiğim kadarıyla teklif terk edilmişti. Sayısal değişmezler ve 0bikili değişmezler için önek aldık . Whoop.
erickson

Kehanet topluluğun onlara nasıl çalışacaklarını söylemesini istemediğinden, bu öneriler muhtemelen java yerine kotlin'de uygulanıyor ... 2018'deyiz ve maalesef bu teklif hakkında hala bir şey yok
JoelBonetR

11

Varsayılan olarak, herhangi bir ilkel veri türü (bayt, kısa, int, uzun) java derleyicisi tarafından int türü olarak ele alınacaktır . İçin byte ve kısa sürece kendilerine tahsis değer onların aralığında olduğu gibi, hiçbir sorun ve gerekli hiçbir eki yoktur. Atanan değer ise byte ve kısa onların aralığını aşması, açık tip döküm gereklidir.

Ör:

byte b = 130; // CE: range is exceeding.

bunun üstesinden gelmek için tip döküm gerçekleştirin.

byte b = (byte)130; //valid, but chances of losing data is there.

Uzun veri türü olması durumunda, tamsayı değerini herhangi bir güçlük çekmeden kabul edebilir. Şöyle atadığımızı varsayalım

Long l = 2147483647; //which is max value of int

bu durumda L / l gibi son ek gerekmez. Varsayılan değer olarak 2147483647, java derleyicisi tarafından int türü olarak kabul edilir. Dahili tip atama derleyici tarafından yapılır ve int otomatik olarak Uzun tipe yükseltilir.

Long l = 2147483648; //CE: value is treated as int but out of range 

Burada java derleyicisinin hazırladığı 2147483648 kelimesini uzun tip olarak ele almak için L soneki koymamız gerekiyor.

en sonunda

Long l = 2147483648L;// works fine.


1

Görünüşe göre bunlara sahip olmak iyi olacak çünkü (sanırım) yazdığınız sayıyı belirtebilseydiniz, java'nın onu yayınlaması gerekmezdi.

Değişmez değerlerin ayrıştırılması derleme sırasında gerçekleştiğinden, bu performans açısından kesinlikle önemsizdir. Eklerin shortve byteson eklerin güzel olmasının tek nedeni, daha kompakt kodlara yol açmasıdır.


0

Neden intve longdeğişmezler arasında ayrım yapmanın gerekli olduğunu anlamak için şunları göz önünde bulundurun:

long l = -1 >>> 1;

karşı

int a = -1;
long l = a >>> 1;

Şimdi haklı olarak beklediğiniz gibi, her iki kod parçası da değişkene aynı değeri veriyor l. Ayırt edemeden intve longedebi olmadan , yorum -1 >>> 1nedir?

-1L >>> 1 // ?

veya

(int)-1 >>> 1 // ?

Dolayısıyla, sayı ortak aralıkta olsa bile, tür belirtmemiz gerekir. Varsayılan, değişmez değerin büyüklüğüyle değiştiyse, sadece rakamların değiştirilmesinden dolayı ifadelerin yorumlanmasında garip bir değişiklik olur.

Bu için oluşmaz byte, shortve charonlar her zaman aritmetik ve bitsel işlemleri yapmadan önce terfi çünkü. Muhtemelen bunların, örneğin dizi başlatma ifadelerinde kullanılmak üzere tamsayı tipi sonekler olması gerekir, ancak yoktur. floatson eki kullanır fve double d. Diğer değişmezler, için özel bir tür olan, kesin türlere sahiptir null.


O günlerde ne demek istediğinle gerçekten ilgilenirdim. Her iki durumda da 2147483647 alıyorum ve neden başka bir şey beklemem gerektiğini anlamıyorum.
inanılmaz Oca

Sen haklı olarak beklenebilir @TheincredibleJan Integer.MAX_VALUEAncak ayırt yolu yoktur eğer oldu intve longo belirsiz olacaktır değişmezleri. / Bu soruyu hatırlamıyorum ama cevabımı yine de açıkladım.
Tom Hawtin - tackline
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.