Setara jawa panjang unsigned lama?

106

Di C ++, saya menikmati akses ke 64 bit unsigned integer, via unsigned long long int, atau via uint64_t. Sekarang, di Java panjangnya 64 bit, saya tahu. Namun, mereka ditandatangani.

Apakah ada unsigned long (long) yang tersedia sebagai primitif Java? Bagaimana cara saya menggunakannya?

sebelas81
sumber
4
CATATAN Jawaban yang diterima sudah usang pada Java 8 dan yang lebih baru. Lihat Answer by GigaStore untuk fitur baru di mana Anda dapat meminta Java untuk menganggap suatu nomor sebagai unsigned. Bukan untuk penggunaan sehari-hari, tapi berguna saat Anda membutuhkannya.
Basil Bourque

Jawaban:

55

Saya tidak percaya begitu. Begitu Anda ingin menjadi lebih besar dari long yang ditandatangani, saya pikir BigInteger adalah satu-satunya cara (di luar kotak) untuk pergi.

Sean Bright
sumber
17
Jawaban ini agak ketinggalan jaman (sudah diposting 2009). Mulai Java 8 (dirilis Maret 2014), ada dukungan untuk unsigned long. Lihat contoh yang saya posting di bawah ini sebagai jawaban.
Amr
140

Mulai Java 8, ada dukungan untuk unsigned long (unsigned 64 bits). Cara menggunakannya adalah:

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

Untuk mencetaknya, Anda tidak bisa begitu saja mencetak l1, tetapi Anda harus terlebih dahulu:

String l1Str = Long.toUnsignedString(l1)

Kemudian

System.out.println(l1Str);
Amr
sumber
@ j10, Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));Tidak benar-benar elegan karena tidak memiliki pemeriksaan rentang, tetapi akan memungkinkan Anda menarik masukan numerik panjang yang jika tidak memungkinkan melebihi rentang panjang yang ditandatangani. (Memanfaatkan fakta yang Scanner::next(...)juga dapat menerima objek Pola atau pola String.)
Spencer D
itu sulit.
Alex78191
12

Tidak, tidak ada. Anda harus menggunakan tipe longdata primitif dan menangani masalah penandatanganan, atau menggunakan kelas seperti BigInteger.

Adam Rosenfield
sumber
7

Tidak, tidak ada. Para desainer Java dalam catatan mengatakan mereka tidak menyukai unsigned int. Gunakan BigInteger sebagai gantinya. Lihat pertanyaan ini untuk detailnya.

Paul Tomblin
sumber
22
Saya menghormati Gosling atas apa yang telah dia lakukan, tapi saya pikir pembelaannya atas int unsigned int adalah salah satu alasan paling bodoh yang pernah saya dengar. :-) Kami punya lebih banyak hal aneh di Java daripada unsigned ints ... :-)
Brian Knoblauch
1
Gosling di JavaPolis 2007 memberikan contoh yang membingungkan tidak bekerja untuk int unsigned. Josh Bloch menunjukkan itu juga tidak berhasil untuk int yang ditandatangani. Bilangan bulat berukuran sewenang-wenang ftw!
Tom Hawtin - tackline
2
@PP .: Saya rasa tidak mungkin untuk mendefinisikan aturan yang masuk akal yang memungkinkan interaksi bebas antara tipe yang ditandatangani dan tidak ditandatangani ketika setidaknya salah satu dari mereka telah mendefinisikan perilaku pembungkus. Itu karena telah mengatakan, byte unsigned atau pendek unsigned akan menyebabkan nol kesulitan karena byte tidak berinteraksi dengan jenis lain pula. Masalah yang lebih besar adalah memiliki perilaku pembungkusan yang ditentukan untuk jenis yang digunakan untuk merepresentasikan angka , yang berbeda dengan jenis pembungkusan terpisah untuk kejadian langka tersebut (seperti penghitungan kode hash) saat perilaku pembungkusan benar-benar berguna.
supercat
3
@PP .: Saya berharap perancang bahasa akan mengenali pentingnya membedakan angka dari cincin aljabar (apa itu jenis "bilangan bulat pembungkus"). Setiap nomor ukuran harus secara implisit dikonversi ke cincin ukuran apa pun, tetapi cincin hanya boleh diubah menjadi angka melalui fungsi atau melalui typecast eksplisit ke nomor ukuran yang sama . Perilaku C, di mana tipe unsigned umumnya berperilaku sebagai cincin aljabar tetapi terkadang berperilaku sebagai angka mungkin adalah yang terburuk dari semua kemungkinan dunia; Aku tidak bisa menyalahkan Gosling karena ingin menghindarinya, meskipun dia benar-benar melakukan pendekatan yang salah.
supercat
6

Java 8 menyediakan satu set operasi panjang tak bertanda yang memungkinkan Anda untuk secara langsung memperlakukan variabel Panjang tersebut sebagai tak bertanda Long, berikut adalah beberapa yang umum digunakan:

Dan penambahan, pengurangan, dan perkalian adalah sama untuk long bertanda dan tidak bertanda tangan.

keelar
sumber
2
Melihat sekilas kode sumber memberi tahu saya untuk sedikit berhati-hati dengan metode ini. Ketika longs memang negatif (yaitu ada perbedaan dari case yang ditandatangani) kelas BigInteger akan digunakan. Ini berarti hingga 8 BigInteger baru akan dialokasikan, ini cukup banyak dan pasti penurunan kinerja.
Toonijn
4

Bergantung pada operasi yang ingin Anda lakukan, hasilnya hampir sama, ditandatangani atau tidak. Namun, kecuali Anda menggunakan operasi sepele, Anda akan berakhir menggunakan BigInteger.

Peter Lawrey
sumber
4

Untuk unsigned long Anda dapat menggunakan kelas UnsignedLong dari pustaka Guava :

Ini mendukung berbagai operasi:

  • plus
  • minus
  • waktu
  • mod
  • dibagi dengan

Hal yang tampaknya hilang saat ini adalah operator pergeseran byte. Jika Anda membutuhkannya, Anda dapat menggunakan BigInteger dari Java.

Andrejs
sumber
3

Java tidak memiliki tipe unsigned. Seperti yang telah disebutkan, lakukan overhead BigInteger atau gunakan JNI untuk mengakses kode native.

basszero
sumber
15
char adalah nilai 16-bit unsigned;)
Peter Lawrey
2

Paket org.apache.axis.types memiliki file

Kelas unsignedLong.

untuk maven:

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

Sepertinya di Java 8 beberapa metode ditambahkan ke Long untuk memperlakukan barang lama [ditandatangani] asalkan tidak ditandatangani. Tampaknya seperti solusi, tetapi terkadang dapat membantu.

Mikalai Sabel
sumber