Rumah > Java > javaTutorial > Mengapakah Penukaran Int-to-Byte Java Menghasilkan Nilai Negatif?

Mengapakah Penukaran Int-to-Byte Java Menghasilkan Nilai Negatif?

Linda Hamilton
Lepaskan: 2024-11-08 13:35:02
asal
204 orang telah melayarinya

Why Does Java's Int-to-Byte Conversion Result in a Negative Value?

Gelagat Tidak Dijangka dalam Penukaran Int-ke-Byte Java

Apabila menukar integer (int) kepada bait (bait) dalam Java, keputusan yang tidak dijangka mungkin timbul. Pertimbangkan kod berikut:

int i = 132;

byte b = (byte) i;
System.out.println(b);
Salin selepas log masuk

Anehnya, outputnya bukan 132 tetapi sebaliknya -124. Untuk memahami sebabnya, kita perlu menyelidiki perwakilan dalaman jenis primitif dalam Java.

Nombor Bertanda dan Pelengkap Dua

Di Java, ints ditandatangani 32-bit integer, manakala bait ialah integer bertanda 8-bit. Integer yang ditandatangani boleh mewakili kedua-dua nilai positif dan negatif menggunakan tatatanda pelengkap dua. Dalam tatatanda ini, bit paling kiri (MSB) menentukan tanda nombor, dengan 0 menunjukkan positif dan 1 menunjukkan negatif.

Penukaran daripada Int kepada Byte

Apabila menukar daripada int kepada bait, Java mengekalkan bit tanda dan membuang baki 24 bit. Ini bermakna jika nilai int adalah positif, nilai bait yang terhasil juga akan menjadi positif. Walau bagaimanapun, jika nilai int adalah negatif, seperti dalam contoh kami, nilai bait yang terhasil akan kelihatan negatif.

Penyongsangan Pelengkap Keduanya

Untuk memahami tingkah laku negatif ini, kita perlu mempertimbangkan proses penyongsangan pelengkap kedua-duanya. Untuk mewakili nombor negatif, pelengkap dua menyongsangkan semua bit dan menambah 1 pada hasilnya. Dalam kes kami, nilai int 132 ialah 10000100 dalam binari. Menyongsangkan bit dan menambah 1 memberi kita 01111011, iaitu -124 dalam tatatanda perpuluhan.

Nilai Bait Tidak Ditandatangani

Dalam contoh kami, kami biasanya menjangkakan nilai bait menjadi tidak ditandatangani, yang akan memberi kita nilai positif 132 dan bukannya -124. Untuk mendapatkan nilai yang tidak ditandatangani daripada bait, kita boleh menggunakan bitmask yang mengeluarkan bit tanda dan mengekstrak hanya 8 bit yang lebih rendah.

byte signedByte = -124;
int unsignedByte = signedByte & 0xff;

System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
Salin selepas log masuk

Ini akan mencetak "Ditandatangani: -124 Tidak Ditandatangani: 132", memberikan kami nilai yang tidak ditandatangani yang dikehendaki.

Atas ialah kandungan terperinci Mengapakah Penukaran Int-to-Byte Java Menghasilkan Nilai Negatif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan