Penukaran Int-to-Byte Java yang Membingungkan: Memahami Nilai Tidak Ditandatangani
Semasa bekerja dengan jenis primitif Java, pembangun sering menghadapi masalah yang menarik tingkah laku apabila menukar integer (int) kepada bait (bait). Seperti yang ditunjukkan dalam coretan kod di bawah, menghantar integer positif kepada bait secara tidak dijangka menghasilkan nilai negatif yang kelihatan salah:
int i = 132; byte b = (byte) i; System.out.println(b); // Output: -124
Mengapakah output kod ringkas ini -124 dan bukannya 132 yang dijangkakan? Untuk membongkar misteri ini, kami menyelidiki selok-belok jenis primitif Java dan perwakilan dalaman nilai bertanda dan tidak bertanda.
Memahami Jenis Bertanda dan Tidak Bertanda dalam Java
Dalam Java, jenis primitif seperti int, bait, pendek dan panjang ditandatangani, bermakna mereka boleh mewakili kedua-dua nilai positif dan negatif. Jenis ini menggunakan tatatanda pelengkap dua, di mana bit paling ketara (MSB) menentukan tanda nombor. Jika MSB ialah 0, bilangannya adalah positif; jika tidak, ia adalah negatif.
Peranan Bitwise DAN
Untuk menyelesaikan kekeliruan dan mendedahkan nilai sebenar bait yang tidak ditandatangani, kami menggunakan operasi bitwise. Khususnya, kami menggunakan operator bitwise AND ("&") bersama-sama dengan bitmask, biasanya diwakili oleh 0xff. Bitmask memastikan bahawa hanya 8 bit bawah integer dikekalkan, dengan berkesan mengalih keluar sebarang bit tanda.
byte signedByte = -1; int unsignedByte = signedByte & 0xff; System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte); // Output: Signed: -1 Unsigned: 255
Dengan menutup bit atas, kami mengasingkan nilai asal tidak bertanda bait, mendedahkan bahawa ia adalah sememangnya nilai positif (255 dalam kes ini).
Kesan Penukaran
Apabila Java menukar int kepada bait, ia memotong 24 bit paling kiri, meninggalkan hanya 8 bit yang lebih rendah. Tafsiran bit yang tinggal ini bergantung pada kehadiran bit tanda. Jika bit tanda ialah 1 (negatif), Java menganggap nilainya negatif dan membalikkan baki 7 bit. Walau bagaimanapun, jika bit tanda ialah 0 (positif), bit yang tinggal dibaca sebagai nilai tidak bertanda.
Kesimpulan
Dengan memahami sifat bertanda jenis primitif Java dan peranan bitmasking, kita boleh menafikan gelagat yang kelihatan ganjil yang diperhatikan apabila menukar int kepada bait. Pengetahuan ini memberi kuasa kepada pembangun untuk memanipulasi dan mentafsir data dengan tepat, memastikan kod Java mereka berfungsi seperti yang dimaksudkan.
Atas ialah kandungan terperinci Mengapakah Penukaran int to byte Java Menghasilkan Nilai Negatif yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!