Unsigned long long'un Java eşdeğeri?


106

C ++ 'da, 64 bitlik işaretsiz bir tam sayıya, aracılığıyla unsigned long long intveya aracılığıyla erişim sağlamaktan keyif aldım uint64_t. Şimdi, Java uzunlukları 64 bittir, biliyorum. Ancak imzalandı.

Java ilkeli olarak işaretsiz uzun (uzun) var mı? Bunu nasıl kullanabilirim?


4
NOT Kabul edilen yanıt, Java 8 ve sonrası için geçerliliğini yitirmiştir. Java'dan bir numarayı işaretsiz olarak değerlendirmesini isteyebileceğiniz yeni özellik için GigaStore'un Yanıtına bakın . Günlük kullanım için değil, ihtiyaç duyduğunuzda kullanışlı.
Fesleğen Bourque

Yanıtlar:


55

Ben inanmıyorum Bir kez imzalanmış bir zamandan daha büyük olmak istediğinizde, BigInteger'ın gidilecek tek (kullanıma hazır) yol olduğunu düşünüyorum.


17
Bu cevap biraz modası geçmiş (2009'da yayınlandı). Java 8'den başlayarak (Mart 2014'te yayınlandı), imzasız uzunlar için destek var. Cevap olarak aşağıda yayınladığım bir örneği kontrol edin.
Amr

140

Java 8'den başlayarak, imzasız uzun (işaretsiz 64 bit) desteği vardır. Bunu kullanmanın yolu:

Long l1 = Long.parseUnsignedLong("17916881237904312345");

Yazdırmak için l1'i basamazsınız, ancak önce yapmanız gerekenler:

String l1Str = Long.toUnsignedString(l1)

Sonra

System.out.println(l1Str);

@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));Tam olarak zarif değil çünkü bir aralık kontrolünden yoksun, ancak aksi takdirde mümkün olan uzun nümerik girdileri çekmenize izin verirdi, aksi takdirde işaretli uzun aralığı aşabilir. ( Scanner::next(...)Bir Desen nesnesini veya Dize desenini de kabul edebilen gerçeğinden yararlanır .)
Spencer D

zor.
Alex78191

12

Hayır, yok. İlkel longveri türünü kullanmanız ve imzalama sorunlarını çözmeniz veya gibi bir sınıf kullanmanız gerekir BigInteger.


7

Hayır yok. Java tasarımcıları, imzasız girişleri sevmediklerini söyledikleri kayıtlara geçti. Bunun yerine bir BigInteger kullanın. Ayrıntılar için bu soruya bakın.


22
Gosling'e yaptıklarından ötürü saygı duyuyorum, ama onun imzasız hiçbir şeyi savunmaması, şimdiye kadar duyduğum en aptalca bahanelerden biri. :-) Java'da waaaay imzasız girişlerden daha riskli şeylere sahibiz ... :-)
Brian Knoblauch

1
JavaPolis 2007'deki Gosling, imzasız girişler için kafa karıştırıcı bir şekilde çalışmayan bir örnek verdi. Josh Bloch, oturum açma işlemleri için de işe yaramadığını belirtti. Keyfi boyutlu tamsayılar ftw!
Tom Hawtin - tackline


2
@PP .: İşaretli ve işaretsiz türler arasında ücretsiz etkileşime izin veren mantıklı kurallar tanımlamanın mümkün olduğunu sanmıyorum, bunlardan en az biri tanımlanmış sarma davranışına sahip. Belirtilmiş olsaydı, baytlar diğer türlerle zaten etkileşime girmediğinden , işaretsiz bayt veya işaretsiz kısa devre sıfır soruna neden olurdu . Daha büyük bir sorun, sarmalama davranışının gerçekten yararlı olduğu nadir durumlar için (karma kod hesaplamaları gibi) ayrı sarma türlerine sahip olmaktan farklı olarak, sayıları temsil etmek için kullanılan türler için tanımlanmış kaydırma davranışıdır .
supercat

3
@PP .: Dil tasarımcılarının sayıları cebirsel halkalardan ayırt etmenin önemini fark etmelerini diliyorum ("tamsayı sarma" türleri nelerdir). Herhangi bir boyut numarası örtük olarak herhangi bir boyuttaki yüzüğe dönüştürülmelidir, ancak halkalar yalnızca işlev veya açık typecast aracılığıyla aynı boyut numarasına dönüştürülmelidir. İşaretsiz türlerin genellikle cebirsel halkalar gibi davrandığı, ancak bazen sayılar gibi davrandığı C'nin davranışı, muhtemelen tüm olası dünyaların en kötüsüdür; Gosling'i bundan kaçınmak istediği için suçlayamam, ancak bunu yapmak için tamamen yanlış bir yaklaşım benimsedi.
supercat

6

Java 8 , bu Uzun değişkenleri doğrudan imzasız Uzun olarak değerlendirmenize olanak tanıyan bir dizi işaretsiz uzun işlem sağlar, işte yaygın olarak kullanılanlardan bazıları:

İşaretli ve işaretsiz uzunlar için eklemeler, çıkarmalar ve çarpmalar aynıdır.


2
Kaynak koduna hızlı bir bakış, bu yöntemlerle biraz dikkatli olmamı söylüyor. Uzunlar gerçekten negatif olduğunda (yani işaretli durumdan bir fark varsa) BigInteger sınıfı kullanılacaktır. Bu, 8 adede kadar yeni BigInteger'ın tahsis edileceği anlamına gelir, bu oldukça fazla ve kesinlikle bir performans düşüşü.
Toonijn

4

Gerçekleştirmek istediğiniz operasyonlara bağlı olarak, sonuç hemen hemen aynıdır, imzalı veya imzasızdır. Ancak, önemsiz işlemler kullanmadığınız sürece, BigInteger'ı kullanacaksınız.


4

İmzasız uzun süre için Guava kütüphanesinden UnsignedLong sınıfını kullanabilirsiniz. :

Çeşitli işlemleri destekler:

  • artı
  • eksi
  • zamanlar
  • mod
  • bölü

Şu anda eksik görünen şey, bayt kaydırma operatörleri. Bunlara ihtiyacınız varsa Java'dan BigInteger'ı kullanabilirsiniz.


3

Java'nın işaretsiz türleri yoktur. Daha önce de belirtildiği gibi, BigInteger'ın ek yükünü üstlenin veya yerel koda erişmek için JNI kullanın.


15
char işaretsiz 16 bitlik bir değerdir;)
Peter Lawrey

2

Org.apache.axis.types paketinde bir

UnsignedLong sınıfı.

maven için:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

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.