แม้ว่ามันจะสายเกินไป แต่ฉันก็อยากจะให้ข้อมูลของฉันเกี่ยวกับเรื่องนี้เพราะอาจทำให้กระจ่างได้ว่าทำไมวิธีการแก้ปัญหาที่ JB Nizet ให้ไว้จึงใช้ได้ผล ฉันสะดุดกับปัญหาเล็กน้อยนี้ในการทำงานกับตัวแยกวิเคราะห์ไบต์และการแปลงสตริงด้วยตัวเอง เมื่อคุณคัดลอกจากประเภทอินทิกรัลที่มีขนาดใหญ่กว่าไปยังประเภทอินทิกรัลที่มีขนาดเล็กกว่าดังที่เอกสารจาวากล่าวว่าสิ่งนี้จะเกิดขึ้น:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
การแปลงจำนวนเต็มที่ลงนามให้แคบลงเป็นประเภทอินทิกรัล T เพียงแค่ละทิ้งทั้งหมด แต่ n ต่ำสุด ลำดับบิตโดยที่ n คือจำนวนบิตที่ใช้แทนชนิด T นอกเหนือจากการสูญเสียข้อมูลที่เป็นไปได้เกี่ยวกับขนาดของค่าตัวเลขแล้วสิ่งนี้อาจทำให้เครื่องหมายของค่าผลลัพธ์แตกต่างจากสัญลักษณ์ของค่าอินพุต .
คุณสามารถมั่นใจได้ว่าไบต์เป็นประเภทอินทิกรัลตามที่เอกสารจาวานี้ระบุว่า
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
ไบต์: ประเภทข้อมูลไบต์คือ 8 บิตที่เซ็นชื่อสอง เติมเต็มจำนวนเต็ม
ดังนั้นในกรณีของการส่งจำนวนเต็ม (32 บิต) เป็นไบต์ (8 บิต) คุณเพียงแค่คัดลอกส่วนสุดท้าย (8 บิตที่มีนัยสำคัญน้อยที่สุด) ของจำนวนเต็มนั้นไปยังตัวแปรไบต์ที่กำหนด
int a = 128;
byte b = (byte)a;
System.out.println(b);
ส่วนที่สองของเรื่องราวเกี่ยวข้องกับวิธีการที่ตัวดำเนินการยูนารีและไบนารีของ Java ส่งเสริมตัวถูกดำเนินการ
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 การ
ขยายการแปลงแบบดั้งเดิม (§5.1.2) จะใช้กับการแปลงตัวถูกดำเนินการอย่างใดอย่างหนึ่งหรือทั้งสองอย่างตามที่ระบุ ตามกฎต่อไปนี้:
ถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นประเภท double อีกตัวจะถูกแปลงเป็น double
มิฉะนั้นถ้าตัวถูกดำเนินการอย่างใดอย่างหนึ่งเป็นประเภท float อีกตัวหนึ่งจะถูกแปลงเป็น float
มิฉะนั้นถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นประเภท long อีกตัวถูกแปลงเป็น long
มิฉะนั้นตัวถูกดำเนินการทั้งสองจะถูกแปลงเป็นประเภท int
มั่นใจได้หากคุณกำลังทำงานกับอินทิกรัลประเภท int และ / หรือต่ำกว่าจะได้รับการเลื่อนระดับเป็น int
a = b & 0xFF;
System.out.println(a);
ฉันเกาหัวของฉันด้วย :) มีคำตอบที่ดีสำหรับเรื่องนี้โดย rgettman
ตัวดำเนินการ Bitwise ใน java สำหรับจำนวนเต็มและ long เท่านั้น?