Rumah  >  Artikel  >  Java  >  Mengapakah Penukaran int to byte Java Menghasilkan Nilai Negatif yang Tidak Dijangka?

Mengapakah Penukaran int to byte Java Menghasilkan Nilai Negatif yang Tidak Dijangka?

Patricia Arquette
Patricia Arquetteasal
2024-11-07 18:11:03652semak imbas

Why Does Java's int to byte Conversion Produce Unexpected Negative Values?

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!

Kenyataan:
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