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);
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);
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!