Java - ไม่สามารถแก้ไขเนื้อหาอาร์เรย์ไบต์ได้ใช่ไหม [ทำซ้ำ]

    byte[] stuffA = {69,96,13,37,-69,-96,-13,-37};
    for(int x = 0; x < stuffA.length; x++){
        if(stuffA[x] < 0){
            System.out.println("Somethin be up yo! ");
            System.out.println("This number be negative! " + (int)stuffA[x]);
            stuffA[x] = (byte)((int)stuffA[x] + 256);
            System.out.println("I added 256 and now stuff is positive yo! " + stuffA[x]);
        }
    }
    return;

เมื่อฉันรันสิ่งนี้ ผลลัพธ์ของฉันคือ:

Somethin be up yo! 
This number be negative! -69
I added 256 and now stuff is positive yo! -69
Somethin be up yo! 
This number be negative! -96
I added 256 and now stuff is positive yo! -96
Somethin be up yo! 
This number be negative! -13
I added 256 and now stuff is positive yo! -13
Somethin be up yo! 
This number be negative! -37
I added 256 and now stuff is positive yo! -37

เกิดอะไรขึ้น?


person Foo Bar    schedule 29.09.2015    source แหล่งที่มา
comment
คุณคิดว่าช่วงของค่าที่คุณสามารถจัดเก็บเป็นไบต์ได้คือเท่าใด   -  person Andy Turner    schedule 29.09.2015


คำตอบ (6)



ไบต์มีช่วงระหว่าง -128 ถึง 127 (-2^7 ถึง 2^7-1) การเพิ่ม 256 ก็เหมือนกับการหมุน 360 องศา เปลี่ยน 256 เป็น 128 ในรหัสของคุณและในจะแสดงผลลัพธ์ที่แตกต่าง

person Armando SM    schedule 29.09.2015

byte มีขนาดเพียง 8 บิต จึงสามารถเก็บค่าได้เพียง 2^8 = 256 ค่า มีการเซ็นชื่อใน Java ดังนั้นค่าจึงอยู่ในช่วง [-128,127]

person James Wierzba    schedule 29.09.2015

A byte สามารถเก็บค่า differentnet ได้ 256 ค่า หากคุณเพิ่ม 256 ไบต์จะล้น และผลลัพธ์จะยังคงเหมือนเดิม ใน Java ช่วงคือ [-128, 127]

person AlexWien    schedule 29.09.2015

ไบต์คือ 8 บิต และจำนวนเต็มคือ 32 บิต

โดยพื้นฐานแล้วดูที่บิต:

ไบต์ b = -37 เทียบเท่ากับ 219(int) ซึ่งไบนารี่คือ:

0000 0000 0000 1101 1011

int 256:

0000 0000 0001 0000 0000

การเพิ่มทั้งสองอย่างจะให้ค่า int 475:

0000 0000 0001 1101 1011

ตอนนี้แปลงเป็นไบต์เช่นใช้ LSB 8 บิตจะเป็น:

1101 1011

ซึ่งก็คือ -37

หวังว่านี่จะอธิบายได้

person abhish_gl    schedule 29.09.2015

ไบต์สามารถเก็บค่าที่แตกต่างกัน 256 ได้ ดังนั้นเมื่อคุณเพิ่ม 256 คุณกำลังสร้าง Rol (Rotate left) 8 times ซึ่งส่งกลับค่าเดียวกันกับค่าก่อนหน้า

หากคุณต้องการแปลง -69 เป็น 69 ทำไมคุณไม่สร้าง stuffA[x] *=-1

หากคุณต้องการกลับบิตจริงๆ คุณสามารถใช้ complement operator (~), stuffA[x] = (byte) ~stuffA[x]; แต่เนื่องจาก two's complement form เพื่อให้ได้ตัวเลขเดียวกันกับก่อนหน้า คุณต้อง add 1,

ชอบ stuffA[x] = (byte) ((~stuffA[x]) + 1);

person Johnny Willer    schedule 29.09.2015