Apakah ada cara untuk mendeklarasikan int tidak ditandatangani di Jawa?
Atau pertanyaannya dapat dibingkai seperti ini: Apa yang setara dengan Java dari unsigned?
Hanya untuk memberi tahu Anda konteks saya sedang melihat implementasi Java String.hashcode()
. Saya ingin menguji kemungkinan tabrakan jika integer 32 int bertanda tangan.
>>>
operator sebagai gantinya>>
.Jawaban:
Java tidak memiliki tipe data untuk bilangan bulat tak bertanda .
Anda bisa mendefinisikan
long
bukanint
jika Anda perlu menyimpan nilai besar.Anda juga dapat menggunakan bilangan bulat yang ditandatangani seolah-olah itu tidak ditandatangani. Manfaat dari representasi komplemen dua adalah bahwa sebagian besar operasi (seperti penjumlahan, pengurangan, perkalian, dan shift kiri) identik pada tingkat biner untuk bilangan bulat yang ditandatangani dan tidak ditandatangani. Namun, beberapa operasi (divisi, shift kanan, perbandingan, dan casting) berbeda. Pada Java SE 8, metode baru di
Integer
kelas memungkinkan Anda untuk sepenuhnya menggunakanint
tipe data untuk melakukan aritmatika yang tidak ditandatangani :Perhatikan bahwa
int
variabel masih ditandatangani ketika dideklarasikan tetapi aritmatika yang tidak ditandatangani sekarang dimungkinkan dengan menggunakan metode-metode diInteger
kelas.sumber
int
tipe data untuk mewakili integer 32-bit yang tidak ditandatangani, yang memiliki nilai minimum0
dan nilai maksimum2^32-1
. - lihat docs.oracle.com/javase/tutorial/java/nutsandbolts/… dan docs.oracle.com/javase/8/docs/api/java/lang/Integer.htmlint
seolah-olah itu tidak ditandatangani dengan menggunakan berbagai metode.Ada API untuk Integer unsigned dan Long di Java 8!
sumber
Integer
kelas di Java 8 memungkinkan seseorang untuk menggunakan unsigned int, adalah perbedaan antara hanya dalam ruang dan kecepatan (karena dalam C / C ++ mereka primitif, sementara di Jawa, itu adalah pembungkus seluruh objek)int
terguling, meskipun sudah ditandatangani. Itu C / C ++ di mana unsigned berguling, tetapi masuk menyebabkan "Perilaku Tidak Terdefinisi" pada overflow. Jika "berguling" adalah satu-satunya masalah Anda, Anda tidak perlu tanda tangan. Saya kira, itulah sebabnya rutin CRC, dll. Bekerja di Jawa tanpa usaha ekstra. Dan itulah mengapa API baru hanya menambahkan penguraian, pemformatan, perbandingan, bagi, dan sisanya. Semua operasi lain, yaitu semua manipulasi bit, tetapi juga penjumlahan, pengurangan, penggandaan, dll. Tetap melakukan hal yang benar.Apakah nilai dalam int ditandatangani atau tidak, tergantung pada bagaimana bit diinterpretasikan - Java menginterpretasikan bit sebagai nilai yang ditandatangani (tidak memiliki primitif yang belum ditandatangani).
Jika Anda memiliki int yang ingin Anda tafsirkan sebagai nilai yang tidak ditandatangani (mis. Anda membaca sebuah int dari DataInputStream yang Anda tahu berisi nilai yang tidak ditandatangani) maka Anda dapat melakukan trik berikut.
Perhatikan, penting bahwa heks literal adalah literal yang panjang, bukan literal int - maka 'l' pada akhirnya.
sumber
0xFFFFFF
dan mempertahankan int?Kami membutuhkan nomor unsigned untuk model MySQL unsigned
TINYINT
,SMALLINT
,INT
,BIGINT
di jOOQ , itulah sebabnya mengapa kami telah membuat jOOU , korban perpustakaan minimalis wrapper jenis untuk nomor unsigned integer di Jawa. Contoh:Semua tipe ini meluas
java.lang.Number
dan dapat dikonversi menjadi tipe primitif tingkat tinggi danBigInteger
. Semoga ini membantu.(Penafian: Saya bekerja untuk perusahaan di belakang perpustakaan ini)
sumber
Untuk nomor yang tidak ditandai, Anda dapat menggunakan kelas ini dari perpustakaan Guava :
Mereka mendukung berbagai operasi:
Hal yang tampaknya hilang saat ini adalah operator byte shift. Jika Anda membutuhkannya, Anda dapat menggunakan BigInteger dari Java.
sumber
Gunakan
char
untuk bilangan bulat unsigned 16 bit.sumber
Mungkin ini yang Anda maksud?
getUnsigned(0)
→ 0getUnsigned(1)
→ 1getUnsigned(Integer.MAX_VALUE)
→ 2147483647getUnsigned(Integer.MIN_VALUE)
→ 2147483648getUnsigned(Integer.MIN_VALUE + 1)
→ 2147483649sumber
2 * (long) Integer.MAX_VALUE + 2
lebih mudah dipahami daripada0x1_0000_0000L
? Dalam hal itu, mengapa tidak sederhanareturn signed & 0xFFFF_FFFFL;
?Tampaknya Anda dapat menangani masalah penandatanganan dengan melakukan "logika DAN" pada nilai-nilai sebelum Anda menggunakannya:
Contoh (Nilai
byte[]
header[0]
is0x86
):Hasil:
sumber
Ada jawaban yang bagus di sini, tapi saya tidak melihat demonstrasi operasi bitwise. Seperti Visser (jawaban yang saat ini diterima) mengatakan, Java menandatangani bilangan bulat secara default (Java 8 memiliki bilangan bulat yang tidak ditandatangani, tetapi saya tidak pernah menggunakannya). Tanpa basa-basi lagi, mari kita lakukan ...
Contoh RFC 868
Apa yang terjadi jika Anda perlu menulis bilangan bulat yang tidak ditandatangani ke IO? Contoh praktisnya adalah ketika Anda ingin menampilkan waktu sesuai dengan RFC 868 . Ini membutuhkan bilangan bulat 32-bit, big-endian, tidak ditandatangani yang mengkodekan jumlah detik sejak pukul 12:00 AM 1 Januari 1900. Bagaimana Anda menyandikan ini?
Buat integer 32-bit Anda yang tidak ditandatangani seperti ini:
Deklarasikan array byte 4 byte (32 bit)
Ini menginisialisasi array, lihat Apakah array byte diinisialisasi ke nol di Jawa?. Sekarang Anda harus mengisi setiap byte dalam array dengan informasi dalam urutan big-endian (atau little-endian jika Anda ingin menghancurkan kekacauan). Dengan asumsi Anda memiliki waktu yang lama (bilangan bulat panjang 64 bit di Jawa) disebut
secondsSince1900
(Yang hanya menggunakan nilai 32 bit pertama, dan Anda telah menangani fakta bahwa Referensi tanggal 12:00 AM 1 Januari 1970), maka Anda dapat menggunakan logika DAN untuk mengekstrak bit dari itu dan menggeser bit-bit itu ke posisi (digit) yang tidak akan diabaikan ketika disatukan menjadi Byte, dan dalam urutan big-endian.Kami
my32BitUnsignedInteger
sekarang setara dengan integer big-endian 32 bit yang tidak ditandatangani yang mematuhi standar RCF 868. Ya, datatype lama ditandatangani, tetapi kami mengabaikan fakta itu, karena kami menganggap bahwa secondsSince1900 hanya menggunakan 32 bit yang lebih rendah). Karena memasukkan panjang ke dalam byte, semua bit lebih tinggi dari 2 ^ 7 (dua digit pertama dalam hex) akan diabaikan.Sumber yang dirujuk: Pemrograman Jaringan Java, Edisi ke-4.
sumber
Baru saja membuat potongan kode ini, yang mengubah "this.altura" dari negatif ke angka positif. Semoga ini bisa membantu seseorang yang membutuhkan
sumber
Anda dapat menggunakan fungsi Math.abs (angka). Ini mengembalikan angka positif.
sumber
MIN_VALUE
0